题目描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
思路
- 前缀和:
- 前缀和是指从数组起始位置到当前元素的累加和。
- 通过计算前缀和,可以将子数组的和转换为两个前缀和的差。
- 哈希表:
- 使用哈希表记录每个前缀和出现的次数。
- 通过查找当前前缀和减去目标和
k的结果是否在哈希表中,可以快速确定是否存在一个子数组的和为k。
- 核心逻辑:
- 遍历数组,计算当前前缀和。
- 检查当前前缀和减去目标和
k的结果是否在哈希表中,如果存在,则说明存在一个子数组的和为k,累加计数。 - 更新哈希表,记录当前前缀和出现的次数。
复杂度分析
时间复杂度
O(n),其中 n 是数组 nums 的长度。每个元素只遍历一次,哈希表操作在平均情况下是常数时间。
空间复杂度
O(n), 最坏情况下,哈希表需要存储所有不同的前缀和。
code
var subarraySum = function(nums, k) {
const map = new Map()
map.set(0, 1)
let preSum = 0, count = 0
for(let n of nums){
preSum += n
if(map.has(preSum - k)){
count += map.get(preSum - k)
}
map.set(preSum, (map.get(preSum) || 0) + 1)
}
return count
};