给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
提示:
1 <= nums.length <= 2 * 104-1000 <= nums[i] <= 1000-107 <= k <= 107
class Solution {
public int subarraySum(int[] nums, int k) {
//前缀和+两数之和的问题,因为不确定子数组有几位,所以不能用滑动窗口
//满足这个条件,sum[i+1] - sum[j] = k,就代表有一个子数组符合条件
int length =nums.length;
int[] sums = new int[length+1];
Map<Integer,Integer> map = new HashMap<>();
int result = 0;
sums[0] = 0;
for(int i = 0;i<length;i++){
sums[i+1] = sums[i] + nums[i];
}
for(int i = 0 ;i<length+1;i++){
if(map.containsKey(sums[i] - k)){
result = result + map.get(sums[i] - k);
}
map.put(sums[i],map.getOrDefault(sums[i],0)+1);
}
return result;
}
}

