题目:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
答案:
public static int subarraySum(int[] nums, int k) {
//1.参数检查
if (nums.length == 0) {
return 0;
}
int res = 0, pre = 0;
//2.创建Hash表,存放各个子数组相加的数值。这个地方很巧妙!!!!
HashMap < Integer, Integer > map = new HashMap< >();
map.put(0,1);
//3.遍历数组
for (int i = 0; i < nums.length; i++) {
pre = pre + nums[i];
//3.1如果子数组和 - k 在map中存在,说明,此该子数组减去map中存在的子数组和k相同。
if (map.containsKey(pre - k)){
res += map.get(pre - k);
}
map.put(pre,map.getOrDefault(pre , 0) + 1);
}
return res;
}
思路:
首先,先想清楚一个问题,为什么用当前遍历的所有和 - k 如果存在在哈希表中,那么该子数组就存在。**因为!!!!!**子数组是连续的!!!
eg.
nums = [1,1,2,3,4,5] ; k =5 。
假如遍历到了4这个位置, 此时 pre = 11, map中为:[ 0:1 , 1:1 , 2:1 , 4:1 , 7:1 ]。
此时 pre - k = 6 不存在map中,所以不算。
这样就很好理解了,为什么可以这样做。