0
点赞
收藏
分享

微信扫一扫

leetcode:560. 和为 K 的子数组【非常经典的前缀和 + dict记录】

Hyggelook 2022-05-04 阅读 44
leetcode

在这里插入图片描述

分析

由于可以正数和负数
用一个dict记录不同presum的个数
presum就是一直加num就可以
然后每次count += preSums[presum - k]
这个就是表示以当前num结尾的,有多少个i符合presum 等于当前presum - k的
如果符合,它就可以认为是i,那么子数组(i, j]就是一组解了~

非常重要的是注意初值preSums[0] = 1的设置,因为如果presum - k为0,这样就以为着全部都取也是一种可能

ac code

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 前缀和 + dict记录
        preSums = defaultdict(int)
        ans = 0
        preSums[0] = 1 # 和为0有一种
        presum = 0

        for num in nums:
            presum += num
            ans += preSums[presum - k] # 到这个num(j)时,前面可能取到的i的个数
            preSums[presum] += 1
        
        return ans

总结

讲真,这道题我感觉有点绕
虽然是经典的前缀和 + dict记录
但我感觉过一段时间我再做也不一定做得出来。。。

举报

相关推荐

0 条评论