题目描述
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入: nums = [1,1,1], k = 2
输出: 2
示例 2:
输入: nums = [1,2,3], k = 3
输出: 2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
代码及注释
func subarraySum(nums []int, k int) int {
// 使用 map 存储前缀和及其出现的次数
m := map[int]int{}
// 初始化前缀和为 0,计数器为 0
pre, count := 0, 0
// 初始化,0 的前缀和出现 1 次
m[0] = 1
// 遍历数组 nums
for _, val := range nums {
// 计算当前的前缀和
pre += val
// 如果前缀和 (pre - k) 在 map 中存在,更新计数器
if m[pre - k] > 0 {
count += m[pre - k]
}
// 更新前缀和出现的次数
m[pre]++
}
return count
}
代码解释:
- 使用
m
存储前缀和及其出现的次数。 - 初始化前缀和
pre
为 0,计数器count
为 0。 - 初始化时,前缀和 0 出现 1 次。
- 遍历数组
nums
,计算当前的前缀和pre
。 - 如果
pre - k
在m
中存在,更新计数器count
。 - 更新前缀和
pre
出现的次数。