**Leetcode 523. Continuous Subarray Sum | dp+鸽笼原理

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

https://leetcode.com/problems/continuous-subarray-sum/discuss/99512/Python-with-explanation.-62ms-Time-O(min(n-k))-mostly  这里讲解的很好。

其实关键点就是一个: Sum1 - sum0 == n * k <==> sum1和sum0同余数。 以及因为要求>1个数,所以得处理下余数是0的情况

不知道为啥用map比用set快

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        
        if (k == 0) {
            int cnt = 0;
            for (int i = 0; i < nums.size(); i++) {
                if (i > 0 && nums[i-1] == 0 && nums[i] == 0) return true;
            }
            return false;
        }
        
        k = k >= 0 ? k : -k;
        if (nums.size() >= 2 * k) return true;
        unordered_map<int, int> data;
        
        unordered_set<int> prefix;
        int s = 0;
        // prefix.insert(0);
        for (int i = 0; i < nums.size(); i++) {
            s += nums[i];
            int v = s % k;
            // data[v] ++;
            // if (data[v] >= 2) return true;
            if (v == 0 && s != 0 && nums[i] % k) return true;
            if (prefix.find(v) != prefix.end() ) {
                return true;
            } else {
                prefix.insert(s % k);
            }
        }
        return false;
    }
};
class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        
        if (k == 0) {
            int cnt = 0;
            for (int i = 0; i < nums.size(); i++) {
                if (i > 0 && nums[i-1] == 0 && nums[i] == 0) return true;
            }
            return false;
        }
        
        k = k >= 0 ? k : -k;
        if (nums.size() >= 2 * k) return true;
        unordered_map<int, int> data;
        
        unordered_set<int> prefix;
        int s = 0;
        // prefix.insert(0);
        for (int i = 0; i < nums.size(); i++) {
            s += nums[i];
            int v = s % k;
            data[v] ++;
            if (data[v] >= 2) return true;
            if (v == 0 && s != 0 && nums[i] % k) return true;
            // if (prefix.find(v) != prefix.end() && nums[i] != k) {
            //     return true;
            // } else {
            //     prefix.insert(s - k);
            // }
        }
        return false;
    }
};


猜你喜欢

转载自blog.csdn.net/u011026968/article/details/80213418
今日推荐