Leetcode 523. 連續的子數組和【前綴和+同餘定理】

問題描述

給定一個包含非負數的數組和一個目標整數 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 的餘數。

\color{red}本題中的數組是非負的

實現代碼

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] 題解區:官方答案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章