【專題四】前綴和(3)

📝前言說明:

  • 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

視頻

  • 974. 和可被 K 整除的子數組
    • 個人解
    • 優質解
  • 525. 連續數組
    • 個人解
    • 優質解
  • 1314. 矩陣區域和
    • 個人解


974. 和可被 K 整除的子數組

題目鏈接:974. 和可被 K 整除的子數組

在這里插入圖片描述

個人解

思路:
和上篇文章的第三題一樣,但是,因為哈希表里面可能有多個前綴和都滿足要求,而我沒想到如何快速搜索到這些前綴和。
暴力解法:O( n 2 n^2 n2)是過不了的。


優質解

思路:

  • 哈希表里面有多個前綴和滿足要求是因為:可能出現dp[x2] = dp[x1] + k的情況(即兩數之間差nk),導致對于dp[i],可能有多個前綴和與之匹配。那如何保證唯一且能把這些數全部統計到呢?
  • 我們可以在記錄前綴和的時候,不記錄前綴和,而是記錄前綴和 % k的余數。
  • 因為:如果(dp[i] - dp[x]) % k == 0,則dp[i] % k == dp[x] % k
  • 細節問題:我們的數組中有負數,但是C++ 中的取模性質:負數 % 正數 == 負數。所以我們要對模出來的結果進行修正
  • 修正:對于負數結果修正:余數 = dp[i] % k + k,但是為了正負數同一:余數 = (dp[i] % k + k) % k

代碼:

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int, int> hash;int ans = 0, sum = 0;hash[0] = 1;for(auto x: nums){sum += x; // sum代表當前位置的前綴和int modulus = (sum % k + k) % k;if(hash.count(modulus)) ans += hash[modulus];hash[modulus]++;}return ans;}
};

時間復雜度:O( n n n)
空間復雜度:O( n n n)


525. 連續數組

題目鏈接:525. 連續數組

在這里插入圖片描述

個人解

思路:
腦子銹了,只能想到O( n 2 n^2 n2)的解法。


優質解

思路:

  • 0-1
  • 問題變成:找子數組所有元素和為0的最長子數組。
  • 細節1:哈希表存儲什么? 答:<前綴和,下標>,并且如果遇到相同的前綴和,下標大的不存(因為子數組短)
  • 細節2:當前位置的信息使用完以后才存入哈希表,不然dp[i] - dp[i]這個子數組實際為空
  • 細節3:默認前綴和0的位置要存在-1

代碼:

class Solution {
public:int findMaxLength(vector<int>& nums) {int ans = 0, sum = 0;unordered_map<int, int> hash;hash[0] = -1;for(int i = 0; i < nums.size(); i++){sum += (nums[i] == 0? -1 : 1);if(hash.count(sum)) ans = max(ans, i - hash[sum]);elsehash[sum] = i;}return ans;}
};

時間復雜度:O(n)
空間復雜度:O(n)


1314. 矩陣區域和

題目鏈接:1314. 矩陣區域和

在這里插入圖片描述

個人解

這道題和文章中第二題很像,這道題麻煩在下標對應。
思路:

  • 題意:answer中每一格表示的是:以mat[r][c]為中心的,邊長為2k+1的正方形中所有元素(且在mat中)的和
  • 建立一個二維前綴和數組:dp[i][j]代表mat[0, 0][i, j]這個矩陣內的元素和
  • 然后利用這個前綴和數組來填寫answer
  • 下標對應:初始化時:因為mat的元素是從下標[0, 0]開始的,所以dp[i][j]加的應該是mat[i - 1][j - 1]
  • 使用時:dp[1][1]才對應mat的第一個元素,所以,在使用dp的時候下標都要-1

用時:20:00
屎山代碼:

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));vector<vector<int>> answer(m, vector<int>(n, 0));// 初始化前綴和數組for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];}for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){int x1 = max(0, i - k);int y1 = max(0, j - k);int x2 = min(m - 1, i + k);int y2 = min(n - 1, j + k);answer[i][j] = dp[x2 + 1][y2 + 1] - dp[x1][y2 + 1] - dp[x2 + 1][y1] + dp[x1][y1];}}return answer;}
};

時間復雜度:O( m ? n m*n m?n)
空間復雜度:O( m ? n m*n m?n)


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78840.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度解析:TextRenderManager——Cocos Creator藝術字體渲染核心類

一、類概述 TextRenderManager 是 Cocos Creator 中實現動態藝術字體渲染的核心單例類。它通過整合資源加載、緩存管理、異步隊列和自動布局等功能&#xff0c;支持普通字符模式和圖集模式兩種渲染方案&#xff0c;適用于游戲中的動態文本&#xff08;如聊天內容、排行榜&…

【漫話機器學習系列】229.特征縮放對梯度下降的影響(The Effect Of Feature Scaling Gradient Descent)

特征縮放對梯度下降的影響&#xff1a;為什么特征標準化如此重要&#xff1f; 在機器學習和深度學習中&#xff0c;梯度下降是最常用的優化算法之一。然而&#xff0c;很多人在訓練模型時會遇到收斂速度慢、訓練不穩定的問題&#xff0c;其中一個重要原因就是特征未進行適當的…

【神經網絡與深度學習】批標準化(Batch Normalization)和層標準化(Layer Normalization)

引言 在深度學習中&#xff0c;標準化技術&#xff08;Normalization&#xff09;是提高神經網絡訓練效率和性能的重要工具。其中&#xff0c;批標準化&#xff08;Batch Normalization, BN&#xff09;和層標準化&#xff08;Layer Normalization, LN&#xff09;是兩種常用的…

OpenHarmony之電源管理子系統公共事件定義

OpenHarmony之電源管理子系統公共事件定義 電源管理子系統面向應用發布如下系統公共事件&#xff0c;應用如需訂閱系統公共事件&#xff0c;請參考公共事件接口文檔。 COMMON_EVENT_BATTERY_CHANGED 表示電池充電狀態、電平和其他信息發生變化的公共事件的動作。 值&#x…

linux 環境下 c++ 程序打印 core dump 信息

linux 信號機制 軟中斷信號 Signal&#xff0c;簡稱信號&#xff0c;用來通知進程發生了異步事件&#xff0c;進程之間可以互相通過系統調用 kill 等函數來發送軟中斷信號。內核也可以因為內部事件而給進程發送信號&#xff0c;通知進程發生了某個事件。 進程對信號的處理 進…

Qt開發環境的安裝與問題的解決(2)

文章目錄 1. Qt開發環境安裝的說明2. 通過安裝包進行安裝3. 通過在線下載程序 解決問題下載 https....網路錯誤問題解決開始安裝--第一部分開始安裝--第二部分 4. 建議配置環境變量&#xff08;非必須&#xff09;配置環境變量的意義 簡介&#xff1a;這篇文章主要分享Qt開發環…

【每日EDA行業分析】2025年4月25日

深度總結&#xff1a;EDA 軟件行業現狀與發展趨勢 一、引言 在半導體產業的復雜生態中&#xff0c;EDA 軟件宛如一顆閃耀的明珠&#xff0c;它是集成電路設計的核心工具&#xff0c;貫穿芯片從設計構思到最終封裝測試的全流程&#xff0c;其重要性不言而喻&#xff0c;被譽為…

flutter實踐:比例對比線圖實現

需求&#xff1a;flutter實現一個左右對比線圖,帶有動畫效果 效果圖&#xff1a; Widget _buildTop() {return Container(height: themeData.heightXl,padding: EdgeInsets.symmetric(horizontal: themeData.hSpacingMd),child: Row(mainAxisAlignment: MainAxisAlignment.spa…

測試基礎筆記第十五天

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、集合1.集合的定義二、使用集合列表去重 導包二、函數1.函數介紹2.定義函數3.調用函數4.函數實現登錄案例5.函數的返回值 三、模塊和包1.模塊的概念(Module)2.模…

Linux中的shell腳本練習

1.判斷字符串是否為空 #!/usr/bin/bash while : #:默認值為真 do read -p "請輸入你的密碼: " a pass123456 if [ -z $a ];thenecho "您輸入的密碼不能為空"exit 1 elseif [ $a $pass ];thenecho "登錄成功"breakelseecho "您的密碼輸入有…

使用命令關閉Redis服務端

使用命令關閉Redis服務端。 命令 redis-cli -a 111111 -p 6379 shutdown 有些人redis的端口不是6379&#xff0c;那就自己查一下 參數解釋&#xff1a; -a&#xff1a;Redis密碼 -p&#xff1a;Redis端口 shutdown&#xff1a;關閉命令

嵌入式RTOS實戰:uC/OS-III最新版移植指南(附項目源碼)

文章目錄 前言一、uC/OS簡介二、工程移植2.1 下載ucos源碼2.2 創建空白工程2.3 拷貝ucosiii源碼文件2.3.1 UC-CONFIG2.3.2 UC-CPU2.3.3 UC-LIB2.3.4 UC-OS3 2.3 添加工程文件分組及路徑2.4 代碼首次編譯2.5 源碼修改2.5.1 cpu_cfg.h2.5.2 os_cpu_c.c2.5.3 lib_cfg.h2.5.4 sys.h…

TypeScript中的函數類型定義與類型約束

函數類型定義與類型約束 一、核心概念&#xff1a;類型別名與函數類型 1. 類型別名&#xff08;Type Alias&#xff09; 定義 類型別名使用 type 關鍵字為現有類型創建一個新名稱&#xff0c;可以用于&#xff1a; 基礎類型&#xff08;如 string、number&#xff09;&…

相機DreamCamera2錄像模式適配尺寸

在開發中遇到 一個問題&#xff0c;相機切換視頻模式時&#xff0c;預覽時&#xff0c;界面不能充滿屏幕兩側有黑邊&#xff0c;客戶要求修改&#xff0c;在此記錄 一問題現象&#xff1a; 系統相機在視頻模式下預覽時如下現象如圖1&#xff0c;期望現象如圖2: 圖1 …

SpringCloud組件——Gateway

一.網關 1.問題提出 我們通過Eureka&#xff0c;Nacos解決了服務注冊&#xff0c;服務發現的問題&#xff0c;使用SpringCloud LoadBalance解決了負載均衡的問題&#xff0c;使用OpenFeign解決了遠程調用的問題。 但是當前所有微服務的接口都是直接對外暴露的&#xff0c;可…

C#中構造器及屬性的加載順序

一.基本原則: 先加載靜態構造函數和靜態字段,后加載普通構造函數和普通字段;先加載基類再加載子類; 二.具體的加載順序: 父類靜態字段--->父類靜態構造函數--->子類靜態字段--->子類靜態構造函數--->父類實例字段---> 父類實例構造函數--->子類實例字段-…

Python面試問題

一、Python 基礎 1. Python 的特點 動態類型&#xff1a;變量無需聲明類型。解釋型語言&#xff1a;逐行解釋執行。支持多種編程范式&#xff08;面向對象、函數式、過程式&#xff09;。 2. 列表&#xff08;List&#xff09;與元組&#xff08;Tuple&#xff09;的區別 特…

計算機視覺進化論:YOLOv12、YOLOv11與Darknet系YOLOv7的微調實戰對比

摘要 YOLO系列作為實時目標檢測領域的重要里程碑&#xff0c;持續引領速度與精度的平衡發展。本文圍繞YOLOv7&#xff08;基于Darknet框架&#xff09;、YOLOv11及YOLOv12&#xff0c;系統、深入地對比了三款模型的架構創新、微調策略、核心技術及應用場景。我們詳細解析了三者…

SQL Server 存儲過程開發規范

SQL Server 存儲過程開發規范&#xff08;高級版&#xff09; 1. 總則 1.1 目標 本規范旨在&#xff1a; 提高存儲過程的事務一致性、異常可追蹤性、錯誤透明度。 統一日志記錄、錯誤碼管理、鏈路追蹤&#xff08;Trace ID&#xff09;。 支持復雜事務場景&#xff08;嵌套…

opendds的配置

配置的使用 文檔中說明有4種使用配置的方式&#xff1a; 環境變量 命令行參數&#xff08;將覆蓋環境變量中的配置&#xff09; 配置文件&#xff08;不會覆蓋環境變量或命令行參數中的配置&#xff09; 用戶調用的 API&#xff08;將覆蓋現有配置&#xff09; 這里對開發…