題目詳情
給定一個整數數組 A
,返回其中元素之和可被 K
整除的(連續、非空)子數組的數目。
示例:
輸入:A = [4,5,0,-2,-3,1], K = 5
輸出:7
解釋:
有 7 個子數組滿足其元素之和可被 K = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
提示:
- 1 <= A.length <= 30000
- -10000 <= A[i] <= 10000
- 2 <= K <= 10000
——題目難度:中等
思路
涉及連續子數組問題的話,可以把每次求和的結果記錄下來,這樣可以減少運算次數。
設P[i] = A[0] + A[1] + ... + A[i],則(p[j] - p[i-1])表示下標爲j的元素到下標爲i的元素的元素和(j>=i>=1),
則(p[j] - p[i-1]) mod K = 0 的話,就說明從下標從j到i的元素和滿足被K整除
又根據同餘定理,有P[j] mod K = p[i-1] mod K,說明如果下標j的元素和跟K的取模只要 和 下標從i的元素和跟K的取模 數值相同,則滿足條件。
應用上式時特別需要注意:當如[-3,4,2], K=4的這些情況,也就是處理被除數是負數時,需要對餘數進行特殊處理(因爲要運用上式),所以運用modulus = (sum % K + K) % K這個表達式可以同時處理被除數是正數或者負數的餘數。
-代碼如下
class Solution {
public:
int subarraysDivByK(vector<int>& A, int K) {
unordered_map<int, int> record = {{0, 1}};
int sum = 0, modulus,ans = 0;
/*計算同餘出現的次數 和 統計滿足條件的個數*/
for(auto num: A)
{
sum += num;
/*下面式子的目的是: 當被除數sum是負數的時候,也可以進行處理*/
modulus = (sum % K + K) % K;
if(record[modulus]) {
ans += record[modulus];
}
record[modulus]++;
}
return ans;
}
};