给你一个整数数组 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
思路:用前缀和预处理,用map来保存前面出现的和,注意最开始有个0的,然后和为k即sum(i) - k 在map中出现的次数
class Solution {
public int subarraySum(int[] nums, int k) {
int l = nums.length;
int res = 0;
for(int i = 1; i < l; i++)nums[i] += nums[i-1];
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
for(int i = 0; i < l; i++){
int t = nums[i] - k;
if(map.get(t)!=null)res+=map.get(t);
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
return res;
}
}