Q:给定一个整数数组和一个整数 k,找到该数组中和为 k 的连续的子数组的个数。
我刚看到这题,扫描到关键词【数组】第一反应就是使用【双端指针】这种思路套用,但是有一个问题,这里并没有提示这是个有序的数组,也就是说,我移动指针并不能保证预期数组的膨胀和塌陷。
作为一个小白,我第一反应还是暴力的遍历,能做出来,但是时间复杂度很糟糕^_^
但是在这次遍历的过程中,还是能发现一些规律的 :
- 每次计算比较,都是与之前累加的和进行比较,关于这个和的存储是否可以直接查出来?
- 在不断的计算中,其实出现过几次结果满足预期K的场景,这个次数应该可以和做映射关系
那么根据以上的思路,有几个关键词就体现出来了【映射】【查找】,ok,这样子就可以确定辅助数据结构了 Map
还要注意的是,针对这类问题我们的思路要转变一下 。
题目中要求我们找到数组中和为K,那实际上我们要把这个问题拆解开。
当我们需要找到和为K的时候,其实是指我们需要找到是否存在一个值为 sum - k
综上所述,代码如下:
public static void main(String[] args) {
int k = 2;
int [] array = new int []{1,1,1};
System.out.println(getArray(array,k));
}
private static int getArray(int[] array, int k) {
int count = 0;
int sum = 0;
//sum做key,count做value
Map<Integer,Integer> table = new HashMap<>(2);
table.put(0,1);
for (int num :array) {
//对数组进行累加
sum = sum + num;
//核心:从映射表查找之前是否出现过满足sum-k的值,如果出现过,这次加K,就满足预期等于K
count = count+ table.getOrDefault(sum - k, 0);
table.put(sum,table.getOrDefault(sum,0)+1);
}
return count;
}