给你一个整数数组 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
Related Topics
- 数组
- 哈希表
- 前缀和
连续区间和,必然会想到的内容前缀和
数组
所以在这题目中,我们的思路是这样的
- 要求区间和为
K
的子数组的话,那么就需要判断 在当前位置前面,是否存在前缀和为当前区间和减去K
的情况存在 - 可以在前缀和数组上遍历,当然我们有更好的选择,哈希表
- 在求前缀和数组的过程中,用哈希表统计各个值的前缀和出现次数
- 那么当前位置的前缀和 与这个位置之前的 前缀和能组成多少个符合 区间和为
K
的区间就可以等价🐟, 当前位置之前有多少个 当前位置区间和 减去K
的值的区间和的数量 - 边界考虑:当什么都没有的时候有一个区间和为0的情况
代码
class Solution {
public int subarraySum(int[] nums, int k) {
int[] preSum = new int[nums.length];
HashMap<Integer,Integer> hashMap = new HashMap<>();
hashMap.put(0,1);
int idx = -1;
int count = 0;
while (++idx < nums.length){
preSum[idx] = nums[idx] + (idx>0?preSum[idx-1]:0);
count += hashMap.getOrDefault(preSum[idx] - k,0);
hashMap.put(preSum[idx], hashMap.getOrDefault(preSum[idx],0)+1);
}
return count;
}
}
发表评论