Leetcode 523 连续的子数组和 前缀和 + 哈希表

题目链接
Leetcode 523 连续的子数组和 前缀和 + 哈希表_第1张图片
一维前缀和思想: s u m [ i ] sum[i] sum[i] = s u m [ i − 1 ] sum[i-1] sum[i1] + a [ i ] a[i] a[i]

sum[l] - sum[l-2]     [l-2,l] 区间内的数是 k 的倍数
sum[l] - sum[l-3]     [l-3,l] 区间内的数是 k 的倍数
sum[l] - sum[l-4]     [l-4,l] 区间内的数是 k 的倍数
...
...
...
sum[l] - sum[1]       [1,l] 区间内的数是 k 的倍数
sum[l] - sum[0]       [0,l] 区间内的数是 k 的倍数

( s k s_k sk - s k − n s_{k-n} skn)% k k k == 0 等价于 s k s_k sk% k k k = s k − n % k s_{k-n}\%k skn%k

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> sum(n+1);
        for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + nums[i-1];
        unordered_set<int> hash;
        for(int i = 2; i <= n; i++)
        {
            hash.insert(sum[i-2]%k);
            if(hash.count(sum[i]%k)) return true;
        }
        return false;
    }
};

你可能感兴趣的:(刷题记录本,Leetcode,前缀和,哈希表)