和为 k 的子数组——哈希前缀和

76 阅读1分钟

image.png

  1. 遍历数组,并用哈希存储目前为止的前缀和以及个数,即如果重复则加一,因为是目前为止的前缀和,所以哈希中保存的前缀和皆在当前所求前缀和的前面,所以哈希的无序性也无关紧要
  2. 拿当前的前缀和减去 k 然后去 map 中查找是否有前缀和符合要求,即使当前前缀和减去之前的前缀和等于 k ,并将符合要求的前缀和数量计入答案
  3. 并将当前前缀和存入 map

mp[0] = 1 : 初始化一下 map ,0 记为符合一次要求

代码:

func subarraySum(nums []int, k int) int {
    mp := make(map[int]int)
    mp[0] = 1
    ans, s := 0, 0
    for _, v := range nums {
        s += v
        ans += mp[s-k]
        mp[s]++
    }
    return ans
}