土豆炒青椒
土豆炒青椒

每天都要做题 560 ~ subarray 的 和 等于 k

如果弄不来投资,就把 leetcode 往死里刷……

基本信息

  • 题号:560
  • 题厂:脸书
  • 难度系数:中



已知一个数组,问数组里面有多少 subarray 的和等于 k。

例如:nums = [1,2,3], k = 3

1 + 2 = 3, 3 = 3,所以返回 2。

subarray 需要连续且不为空

解题思路

  • 本题看似简单,其实略难。如果想不到 prefix 很容易卡壳
  • 本题我们需要算出之前元素的和,再根据当前 sum 和之前的差距算出有多少种配对方式……
  • 如何根据 prefix 找出算法,最终又归结于 data pattern 寻找规律上😳



class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 初始返回值 res
        res = 0
        # 创建变量,计算当前变量
        curSum = 0

        # hashmap 用来记录各种 prefix 的数量,为解题关键
        # prefix: count
        # 进入 for 循环之前,初始化前缀和为 0 的时候有 1 种可能——即:数组开头第 -1 个元素,什么元素都没有前缀和此时为 1
        prefixSum = { 0: 1 }
        
        for n in nums:
            curSum += n
            # 计算当前和与目标 k 之间的差距
            diff = curSum - k
            # 如果此时 hashmap 有对应差距的记录,则说明有 x 种可能满足 diff + k = curSum
            res += prefixSum.get(diff, 0)
            
            # 更新 prefix,用于下一次计算……
            prefixSum[curSum] = 1 + prefixSum.get(curSum, 0)
            
        return res



Constraints

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

本题需要引入 「 prefix 前缀和」 的一个原因就是 k 和数组元素可以为负……


Big O

  • Time:O(n)
  • Space:引入 hashmap,故 O(n)


测试

  • 有满足的 subarray 相加和等于 k,有多重状况同时满足,检查算法是否有疏漏
  • 不满足的状况



总结

虽然最终代码不复杂,也没有涉及高级数据结构,但思路挺绕……虽然 brute force 明显可以用来解题,但考点明显是 prefix……😵

基于解体思路,需要定期回顾深入理解 prefix 的精髓……🙈

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论