题目描述:
标签:数组 哈希表 前缀和
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
代码:
思路分析:
1、数学推理,假设pre[i]代表前i个元素的和,所以[j,i]要满足和谐区间的条件,需要
pre[i] - pre[j-1] = K
也就是说
pre[j-1] = pre[i] - K
2、明白以上原理就很好做了,定义一个map来存储前缀和pre出现的次数。并每次观察当前前缀和pre[i]-K是否存在在map中,如果存在则count加相应值。
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int pre = 0;
int count = 0;
for(int i = 0;i < nums.length;i++){
pre += nums[i];
if(map.containsKey(pre-k)){
count += map.get(pre-k);
}
map.put(pre,map.getOrDefault(pre,0)+1);
}
return count;
}
}