参考题解:官方题解
题目:
标签:
- 意想不到。
- 数学。
- 恶心。
思路:
- 这道题其实是考验数学的。
- 很多题都是这样,前缀和要和哈希表配合。
- 以后看到前缀和,第一时间就要考虑到是不是和哈希表要配合。
- 和哈希表配合,就要找到规律。
- 这道题的规律就是,连续数组值要是 k 的倍数,那前后端的前缀和相对于 k 的余数就要相等。因此,只需要一遍扫描就可以,当扫描到后端的余数时,就要检查是否有前端的余数和它相等。如果相等,并且数组大小符合要求,就可以返回 true 了。
题解:
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int length = nums.length;
if (length < 2) {
return false;
}
HashMap<Integer, Integer> map = new HashMap<>();
int[] prefix = new int[length + 1];
map.put(0, 0);
for (int i = 1; i <= length; ++i) {
prefix[i] = prefix[i - 1] + nums[i - 1];
int remain = prefix[i] % k;
if (map.containsKey(remain)) {
int index = map.get(remain);
if (i - index >= 2) {
return true;
}
} else {
map.put(remain, i);
}
}
return false;
}
}