1. 程式人生 > 其它 >LeetCode 523. 連續的子陣列和(%k字首和)

LeetCode 523. 連續的子陣列和(%k字首和)

題意:

給定一個包含 非負數 的陣列和一個目標 整數 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; } };