leetcode刷题笔记-prefix sum

1685. Sum of Absolute Differences in a Sorted Array

class Solution:
    def getSumAbsoluteDifferences(self, nums: List[int]) -> List[int]:
#         res[i] = (nums[i] - nums[0]) + (nums[i] - nums[1]) + ... + (nums[i] - nums[i - 1])        <--- absolute difference of nums[i] with first i numbers
#      + (nums[i] - nums[i]) + (nums[i + 1] - nums[i]) + (nums[i + 2] - nums[i]) + ... + (nums[n - 1] - nums[i])   <--- absolute difference of nums[i] with last n - i numbers

#         res[i] = i * nums[i] - (nums[0] + ... + nums[i - 1])        <--- absolute difference of nums[i] with first i numbers
#      + (nums[i + 1] + ... + nums[n]) - (n - i) * nums[i]   <--- absolute difference of nums[i] with last n - i numbers

#      res[i] = i * nums[i] - prefixSum[i] +
#       prefixSum[n] - prefixSum[i] - (n - i) * nums[i]

        pre_s = [0]
        for n in nums:
            pre_s.append(n + pre_s[-1])
        re, n = [], len(nums)
        for i, v in enumerate(nums):
            re.append(i*v - pre_s[i] + pre_s[n] - pre_s[i] - (n-i) *v)
        return re

974. Subarray Sums Divisible by K

class Solution:
    def subarraysDivByK(self, nums: List[int], k: int) -> int:
        '''
        how many ways can we pair up all prefix sum pairs (i,j) where i < j such that (prefix[j] - prefix[i]) % K == 0. we easily get a O(n^2) solution.
        To linear: 
        I noted above that we need to find all prefix sum pairs (i,j) such tha (p[j] - p[i]) % K == 0.
        But this is only true, if and only if p[j] % K == p[i] % K
        '''
 
        count = [0] * k
        count[0] = 1 # [0] can be diviable by k
        preS = re = 0
        for n in nums:
            preS = (preS + n) % k
            re += count[preS]
            count[preS] += 1
        return re

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值