题目:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
思路:
设nums[i] +...+nums[j] = k,S(n) = nums[0] +...+ nums[n],则 S(i - 1) = S(j) - k。令target = S(i - 1),在求S(j)时,如果已经存在target,那所求次数加上target出现的次数,若还没出现target,记录S(j)出现的次数。
代码:
const subarraySum = (nums, k) => {
let map = { 0: 1 } // S(-1)为0,出现1次(之所以求S(-1)因为i=0时,target = S(-1))
let sum = 0 // 前n项的和
let res = 0 // 所求次数
for (let i = 0; i < nums.length; i++) {
sum += nums[i] // 计算S(i)
let target = sum - k
if (map[target]) {
res += map[target]
}
map[sum] = (map[sum] || 0) + 1 // 记录S(i)出现的次数
}
return res
};