問題描述
給定一個包含非負數的數組和一個目標整數 k,編寫一個函數來判斷該數組是否含有連續的子數組,其大小至少爲 2,總和爲 k 的倍數,即總和爲 n*k,其中 n 也是一個整數。
示例 1:
輸入: [23,2,4,6,7], k = 6
輸出: True
解釋: [2,4] 是一個大小爲 2 的子數組,並且和爲 6。
解題報告
根據同餘定理:(a+b)%k==0
意味着 a%k==b%k
。有了這個定理,我們不妨從 前綴和 的角度來解決這個問題,子數組和爲k的倍數,意味着 preSum[j]%k==preSum[i]%k
。由於並未給出 k 的範圍,採用 map 來存儲前綴和對 k 的餘數。
實現代碼
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
int sum=0;
unordered_map<int,int> map;
map.insert({0,-1});
for(int i=0;i<nums.size();i++){
sum+=nums[i];
if(k!=0)
sum=sum%k;
if(map.count(sum)){
if(i-map[sum]>1)
return true;
}
else
map.insert({sum,i});
}
return false;
}
};
參考資料
[1] 523. 連續的子數組和
[2] 題解區:官方答案