题目链接
一维前缀和思想:
s
u
m
[
i
]
sum[i]
sum[i] =
s
u
m
[
i
−
1
]
sum[i-1]
sum[i−1] +
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} sk−n)% k k k == 0 等价于 s k s_k sk% k k k = s k − n % k s_{k-n}\%k sk−n%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;
}
};