题目

题目解析
题目的意思是说一个数组里面的子数组(子数组是指数组里面所有数字组成的集合,连续的子数组就是需要连续的)的和是 k 的倍数,也就是说,找出一段连续的子数组能是 k 的倍数。
技巧解析
暴力确实可以解决但是会超时,这个时候就需要一些技巧了,这种一般的判断都是 ( a + b ) % k ;但是有个定理就是同余定理,意思就是说,当(a+b+c)% k == (a+b)% k 的时候说明 c 这个数字是 k 的倍数,也就说明,有一个数是 k 的倍数,当有两个的时候,就可以说明有一段连续的子数组是 k 的倍数
ps:
这里说明一个小技巧,我今天才发现,我一直使用nums.length来表示数组的长度,但今天我发现,如果一开始就用一个变量存储nums.length,后面就使用变量去表示的话会快不少。不多说上图
-
这是没有用变量表示的


-
这是使用变量表示的


- 鲜明的对比:

代码解析:
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>();
int re = 0
map.put(re, -1);
//循环遍历
for(int i=0;i<m;i++) {
//与前缀和取余
re = (re+nums[i])%k;
//看map集合中是否有一样的
if(map.containsKey(re)) {
//如果有,取到当时索引
int pre = map.get(re);
//看与现在的索引相对比,是否大于2,如果大于2,说明与之前相比,有两个数相加是K的倍数
if((i - pre)>=2) {
return true;
}
}else {//如果没有,则存储
map.put(re, i);
}
}
//循环遍历之后都没有,说明真的没有
return false;
}
}
博客围绕数组子数组和为k倍数的题目展开。先介绍题目,即找出数组中连续子数组和是k倍数的情况。接着指出暴力解法会超时,引入同余定理这一技巧判断。还提到用变量存储数组长度可提升速度,最后进行代码解析。
554

被折叠的 条评论
为什么被折叠?



