力扣 523. 連續的子數組和 hash+dp

https://leetcode-cn.com/problems/continuous-subarray-sum/

在這裏插入圖片描述

思路:hash+dphash+dp。搞一個hashhash表,dp[sum]=idp[sum]=i,表示[0i][0…i]的前綴和si%k=sums_i\%k=sum,初始可以令dp[0]=1dp[0]=-1,然後遍歷整個數組,記錄前綴和sis_i,如果dp[si%k]dp[s_i\%k]之前出現過且idp[si%k]>=2i-dp[s_i\%k]>=2,就說明有一組滿足題意的解。

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int siz=nums.size();
        if(siz<=1)
            return 0;
        k=abs(k);
        for(int i=1;i<siz;i++)
            if(nums[i]==0&&nums[i-1]==0)    
                 return 1;
        if(!k)
            return 0;
        unordered_map<int,int> dp;
        dp[0]=-1;
        int sum=0;
        for(int i=0;i<siz;i++){
            sum+=nums[i];
            sum%=k;
            if(dp.find(sum)==dp.end())
                dp[sum]=i;
            else if(i-dp[sum]>=2)
                return 1;
        }
        return 0;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章