和为 K 的子数组
和为 K 的子数组
题目
给你一个整数数组
nums
和一个整数k
,请你统计并返回 该数组中和为k
的子数组的个数 。子数组是数组中元素的连续非空序列。
示例
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
思路
- 连续子数组,所以可以搞一个数组dp[i] ,数组的定义是从 0 - i这些数的总和,现在需要求和为k的子数组的个数,所以在遍历到i的时候,可以得到一个dp[i]的值(dp[i - 1] + nums[i]),这时候只要看存不存在j,使dp[i] - dp[j] = k,就是满足要求的,这种情况的个数就是dp[j]的个数,所以使用一个map,key是dp[i]的值,value是有多少组合可以变成dp[i],就是dp[i]的个数。
代码实现
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0,1);
int sum = 0;
int result = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (map.containsKey(sum - k)) {
result += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum,0) + 1);
}
return result;
}