问题描述
解决思路
依旧是前缀和 + 哈希表
不过这个问题需要引入同余定理
即
(
a
−
b
)
%
m
=
0
(a-b) \% m = 0
(a−b)%m=0
与
a
%
m
=
b
%
m
a\%m=b\%m
a%m=b%m
等价
除此之外,我们用map来记录中间每个前缀和求余以及对应前缀和最后的下标,下标只需要保存最小的那个就行
代码如下:
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int m = nums.length;
if (m < 2) {
return false;
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, -1);
int remainder = 0;
for (int i = 0; i < m; i++) {
remainder = (remainder + nums[i]) % k;
if (map.containsKey(remainder)) {
int prevIndex = map.get(remainder);
if (i - prevIndex >= 2) {
return true;
}
} else {
map.put(remainder, i);
}
}
return false;
}
}