题目描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k的子数组的个数。
子数组是数组中元素的连续非空序列。
思路
想象有一根很长的绳子(数组),你想从中间剪下一段(子数组),让这一段的长度正好是 k。
如果你知道从绳子开头到当前剪刀位置的总长度(presum),你只需要往回看:"之前有没有哪个位置,距离开头正好是 presum - k?"
如果能找到这样一个点,那么从那个点到当前点之间的这一段,长度就一定是 k。
只需要使用hashmap每次存储当前所有出现过的前缀和以及该前缀和出现的次数。
遍历数组,每次更新前缀和以后判断presum-k是否存在,如果存在则累加次数。然后将当前的presum加入hashmap
代码
java
class Solution {
public int subarraySum(int[] nums, int k) {
HashMap<Integer,Integer> map =new HashMap<>();
int res=0,presum=0;
map.put(0,1);
for(int num:nums){
presum+=num;
if(map.containsKey(presum-k)){
res+=map.get(presum-k);
}
map.put(presum,map.getOrDefault(presum,0)+1);
}
return res;
}
}