LeetCode 🟡 974. Subarray Sums Divisible by K
🔗 🟡 974. Subarray Sums Divisible by K 1676
tags: Weekly Contest 119
前綴和(Prefix Sum)
雜湊表(Hash Table)
同餘定理
題意
給定一個整數陣列 和一個整數 ,返回具有可以被 整除的和的 非空子陣列 的數量。
子陣列 是陣列的連續部分。
約束條件
思路:前綴和(Prefix Sum) + 雜湊表(Hash Table) + 同餘定理
我們可以使用 前綴和(Prefix Sum) 來計算陣列中每個位置的前綴和,對於子陣列 的和可以表示為 ,若其為 的倍數,則 。
故可以記錄每個前綴和對 取模後的結果,並使用一個雜湊表或長度為 的陣列 來記錄取模後的值出現的次數。當枚舉到第 個位置時,我們可以計算前 個位置的前綴和 ,並對 取模,則 代表前面有多少個位置與當前位置的前綴和對 取模後的結果相同,故能組成需要的子陣列,可以累加其出現次數至答案中。
具體步驟如下:
- 使用一個雜湊表或長度為 的前綴和陣列 來記錄每個前綴和餘數出現的次數,初始化時設置 ,代表空陣列。
- 遍歷陣列 ,對每一個元素累加計算前綴和 。
- 計算當前前綴和 對 的餘數 。
- 由於我們只在意餘數,因此可以每次都將 對 取模。
- 此外,由於約束條件中 可以為負數,而在
C++
中,對負數取模的結果可能為負數,因此我們需要對取模後的結果加上 並再次對 取模,以確保結果為正數。
- 將當前餘數出現的次數累加到答案中,這表示以當前元素為結尾的子陣列中,有多少個子陣列是可以被 整除的。
- 更新雜湊表 中當前餘數出現的次數。
複雜度分析
- 時間複雜度:,其中 為陣列的長度。
- 空間複雜度:,雜湊表的空間複雜度。
- 若使用長度為 的陣列 來記錄,則空間複雜度為 。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is generated by @ゴリラの素材屋さん, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus