给你一个整数数组 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
思路:在循环中计算前缀和sum,若sum[i] - k已经在map中,说明有一个子数组和为k,然后将当前前缀和加入到map中
public class Solution {
public int subarraySum(int[] nums, int k) {
//int[] nums={1,2,-1,1,-1,3}; k=2
//1,3,2,3,2,5
//注意!!!前缀和中(子数组)出现两处3-1=k,则Map更新为(3,2),
说明前缀和中3出现了两次,后续5-3=k,则ans+=2
Map<Integer, Integer> map = new HashMap<>();
//防止第一个数就为子数组
map.put(0,1);
int ans=0,sum=0,i,j=0;
while(j<nums.length){
sum+=nums[j];
if(map.containsKey(sum-k))
ans+=map.get(sum-k);
map.put(sum,map.getOrDefault(sum,0)+1);
j++;
}
return ans;
}
}