LeetCode 560. Subarray Sum Equals K
LeetCode 560. Subarray Sum Equals K (和为 K 的子数组)
题目
链接
https://leetcode-cn.com/problems/subarray-sum-equals-k/
问题描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
示例
输入:nums = [1,1,1], k = 2
输出:2
提示
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
思路
与304类似,也是前缀和思路,把每个数的前缀和存起来。同时也要计算前面有没有符合差值为k的区间,考虑到值有正负,这里采用hashmap存放,分别为前缀和值,和该值的数量,遍历结束即可得到答案。
需要注意的有,最开始时要把数对<0,1>加入,用于处理包含开头的数。
复杂度分析
时间复杂度 O(n)
空间复杂度 O(n)
代码
Java
public int subarraySum(int[] nums, int k) {
int ans = 0;
HashMap map = new HashMap<>();
map.put(0,1);
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
int need = sum - k;
if (map.containsKey(need)) {
ans += map.get(need);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return ans;
}