560. 和为 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
示例 1:
1
2
| 输入:nums = [1,1,1], k = 2
输出:2
|
示例 2:
1
2
| 输入:nums = [1,2,3], k = 3
输出:2
|
前缀和
前缀和:nums 的第 0 项到 当前项 的和。
定义 prefixSum 数组,prefixSum[x]:第 0 项到 第 x 项 的和。
nums 的 第 i 到 j 项 的和,即为 prefixSum[j] − prefixSum[i−1]
当 i 为 0,此时 i-1 为 -1,我们故意让 prefixSum[-1] 为 0,使得通式在 i=0
时也成立
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| // 前缀和
func subarraySum(nums []int, k int) int {
count := 0
curSum := 0 // 记录每次循环当前的前缀和
hash := map[int]int{
0: 1, // 前缀和为0 出现过1次了
}
for i := 0; i < len(nums); i++ {
curSum += nums[i]
if hash[curSum-k] > 0 {
// 当前前缀和减去k的结果也在之前的前缀和表中 代表找到一个和为k的连续子数组
count += hash[curSum-k]
}
hash[curSum]++ // 记录一个前缀和
}
return count
}
|