leetcode刷题记录:前缀和

https://labuladong.online/algo/problem-set/perfix-sum/#%E8%A7%A3%E6%B3%95%E4%BB%A3%E7%A0%81-3
适用范围:快速、频繁地计算一个索引区间内的元素之和

303 区域和检索:数组不可变

https://leetcode.cn/problems/range-sum-query-immutable/

class NumArray(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.preSum = [0 for _ in range(len(nums)+1)]
        for i in range(1, len(nums)+1):
            self.preSum[i] = self.preSum[i-1] + nums[i-1]

    def sumRange(self, left, right):
        """
        :type left: int
        :type right: int
        :rtype: int
        """
        return self.preSum[right+1] - self.preSum[left]

525 连续数组

https://leetcode.cn/problems/contiguous-array/

class Solution(object):
    def findMaxLength(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        n = len(nums)
        preSum = [0 for _ in range(n+1)]
        for i in range(1, n+1):
            preSum[i] = preSum[i-1] + (-1 if nums[i-1] == 0 else 1)
        val2idx = {}
        res = 0
        # print("preSum:", preSum)
        for i in range(0, n+1):
            # print("val2idx:", val2idx)
            if preSum[i] not in val2idx:
                val2idx[preSum[i]] = i
            else:
                res = max(res, i - val2idx[preSum[i]])
        return res

523 连续的子数组和

同余性质:preSum[j] - preSum[i] = n*k -> preSum[j]%k == preSum[i]%k

class Solution(object):
    def checkSubarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        n = len(nums)
        if n < 2:
            return False
        preSum = [0 for _ in range(n+1)]
        for i in range(1, n+1):
            preSum[i] = preSum[i-1] + nums[i-1]
        hashSet = set()
        for i in range(2, n+1):
            hashSet.add(preSum[i-2] % k)
            if preSum[i]%k in hashSet:
                return True
        return False        

560 和为k的数组

https://leetcode.cn/problems/subarray-sum-equals-k/description/
难点:用val2idx记录preSum[i]出现的次数

class Solution(object):
    def subarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        if not nums:
            return 0
        n = len(nums)
        preSum = [0 for _ in range(n+1)]
        for i in range(1, n+1):
            preSum[i] = preSum[i-1] + nums[i-1]
        val2idx = {}
        res = 0
        for i in range(0, n+1):                 
            if preSum[i]-k in val2idx:
                res += val2idx[preSum[i] - k]           
            val2idx[preSum[i]] = val2idx.get(preSum[i], 0) + 1            
        return res

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值