和为 K 的子数组

Posted by zhouqian on Tuesday, July 26, 2022

力扣 560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。


方案一:套用优美子数组 中前缀和的方案。

func subarraySum(nums []int, k int) (ans int) {
    // 定义无序映射,key 为前缀和值,val 为能达到这个前缀和的子数组个数
    mp := make(map[int]int, len(nums))
    // 前缀和为 0 表示什么数字都不选,这种情况的子数组有且只有一个,即空数组
    mp[0] = 1
    // 定义前缀和
    preSum := 0
    for _, num := range nums {
        // 计算前缀和
        preSum += num
        // curr presum - prev presum == k ==> curr presum - k = pre presum
        // 这里的 previous presum 就是子数组个数
        ans += mp[preSum - k]
        // 记录当前前缀和的情况
        mp[preSum]++
    }
    return
}
  • 时间复杂度:O(n),因为需要遍历所有数字才能计算出结果,所以时间复杂度为 O(n)。
  • 空间复杂度:O(n), 因为需要一个容量为 n 的无序映射保存前缀和信息,所以空间复杂度为 O(n)。