LeetCode 523. 連續的子陣列和(%k字首和)
阿新 • • 發佈:2021-02-04
題意:
給定一個包含 非負數 的陣列和一個目標 整數 k,
編寫一個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,且總和為 k 的倍數,
即總和為 n*k,其中 n 也是一個整數。
資料範圍:
陣列的長度不會超過 10,000 。
你可以認為所有數字總和在 32 位有符號整數範圍內。
解法:
計算%k的字首和,問題變為判斷是否存在sum[r]==sum[l-1].
注意特判k=0的情況,這時候問題變為判斷陣列中是否存在長度>=2的連續0.
code:
class Solution {
public:
bool checkSubarraySum(vector<int> & a, int k) {
if(k<0)k=-k;
if(k==0){//特判0
int cnt=0;
for(auto i:a){
if(i==0){
cnt++;
if(cnt>=2)return 1;
}else{
cnt=0;
}
}
return 0;
}
map<int,int>mark;
mark[0]=-1;
int sum=0;
int n=a.size();
for(int i=0;i<n;i++){
sum=(sum+a[i])%k;
if(mark.count(sum)){
if(i-mark[sum]>=2){
return 1;
}
} else{
mark[sum]=i;
}
}
return 0;
}
};