問題描述
給定一個整數數組 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]
解題報告
這道題和 Leetcode 523. 連續的子數組和【前綴和+同餘定理】 挺相似的,但是 Leetcode 523
數組中元素非負,而這道題,正負數都有。
同餘定理中,preSum[j]-preSum[i]%k==0->preSum[i]%k==preSum[j]%k
,這裏要求 preSum[i]
和 preSum[j]
均爲正整數。
當其中存在負數時,需要將等式變換一下。preSum[j]-preSum[i]==0->(preSum[j]%k+k)%k==(preSum[i]%k+k)%k
。
當 preSum[j]
爲正整數時,preSum[j]%k
取爲本身的值;當 preSum[j]
爲負整數時,preSum[j]%k
則應該取爲 preSum[j]%k+k
,爲了統一形式,取爲 (preSum[j]%k+k)%k
。
實現代碼0z
class Solution {
public:
int subarraysDivByK(vector<int>& nums, int k) {
int sum=0,ans=0;
unordered_map<int,int> mp;
mp[0]=1;
for(int i=0;i<nums.size();i++){
sum=((nums[i]+sum)%k+k)%k;
ans+=mp[sum]++;
}
return ans;
}
};