560.和为 K 的子数组

和为 K 的子数组

给你一个整数数组 nums 和一个整数 k,请你统计并返回 该数组中和为 k 的子数组的个数。

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= $2 * 10^4$
  • -1000 <= nums[i] <= 1000
  • $-10^7$ <= k <= $10^7$

解析

前缀和 + 哈希表:如果 prefixSum[j] - prefixSum[i] === k,则 nums[i..j] 的和为 k。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var subarraySum = function (nums, k) {
const map = new Map();
map.set(0, 1); // 前缀和为 0 出现 1 次
let sum = 0;
let count = 0;

for (const num of nums) {
sum += num;
if (map.has(sum - k)) {
count += map.get(sum - k);
}
map.set(sum, (map.get(sum) || 0) + 1);
}
return count;
};

前缀和 + 哈希表是处理子数组和问题的经典套路。时间复杂度 O(n),空间复杂度 O(n)。


560.和为 K 的子数组
https://leetcode.lz5z.com/560.subarray-sum-equals-k/
作者
tickli
发布于
2024年10月24日
许可协议