分析
由于可以正数和负数
用一个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记录
但我感觉过一段时间我再做也不一定做得出来。。。