一般涉及連續子數組的問題都用前綴和來表示
前綴和及爲:(圖來自leetcode官方題解)
所以我們掃描這個整數數組A,
維護一個哈希表:鍵:前綴和模 K 的值,值:出現次數
則每一個前綴和的符合要求的子數組個數及爲,哈希表中鍵所對應值所顯示的個數(注意的是,這裏鍵所對應的值爲1也是可以的,因爲此時有一個子數組)
然後將這些值相加,就是最終子數組的個數
class Solution {
public:
int subarraysDivByK(vector<int>& A, int K) {
unordered_map<int, int> record = {{0, 1}};
int sum = 0, ans = 0;
for (int elem: A) {
sum += elem;
// 注意 C++ 取模的特殊性,當被除數爲負數時取模結果爲負數,需要糾正
int modulus = (sum % K + K) % K;
if (record.count(modulus)) {
ans += record[modulus];
}
++record[modulus];
}
return ans;
}
};
最近有點飄了,明天一定要恢復到狀態!!!