第三章:前缀和技巧

labuladong 前缀和技巧

560. 和为K的子数组

方法1:前缀和 (暴力超时)

保存一个数组的前缀和,然后利用差分法得出任意区间段的和

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
      cnt, n =  0, len(nums)
      pre = [0] * (n + 1)
      for i in range(1, n + 1):
          pre[i] = pre[i - 1] + nums[i - 1]
      for i in range(1, n + 1):
          for j in range(i, n + 1):
              if (pre[j] - pre[i - 1] == k): cnt += 1
      return cnt

方法2:改进版的前缀和,维护更新hashmap

  • 维护一个hashmap,hashmap的key 为累加值 acc,value 为累加值 acc 出现的次数
  • 遍历数组,然后不断更新 acc 和 hashmap,如果 acc 等于 k,那么很明显应该+1. 如果 hashmap[acc - k] 存在,我们就把它加到结果中去即可。
class Solution(object):
    def subarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        from collections import defaultdict
        record=defaultdict(int)
        res=0
        presum=0 # 记录前缀和
        for i in nums:
            presum+=i
            if presum ==k: # 如果当前的前缀和为1,则计数+1
                res+=1
            if presum-k in record: # presum-k已存在,则把record[presum-k]加到结果中
                res+=record[presum-k]
            record[presum]+=1
        return res

   转载规则


《第三章:前缀和技巧》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
python装饰器 python装饰器
装饰器examplePython Decorators in 15 Minutes 什么是装饰器? python装饰器用于装饰函数。可以在保留原函数功能的条件下,赋予该函数更丰富的功能(而无需改动原函数) 为什么要用装饰器? 可以更便
2020-08-13
下一篇 
第三章:双指针技巧总结 第三章:双指针技巧总结
labuladong 双指针技巧总结 利用快慢指针或者左右指针解决问题 141. 环形链表利用快慢指针,一开始都指到头结点处,然后每次快指针走两步,慢指针。若最后相遇了,说明有环 # Definition for singly-linked
2020-08-12
  目录