首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【python刷题】差分数组

【python刷题】差分数组

作者头像
西西嘛呦
发布于 2021-02-22 11:33:52
发布于 2021-02-22 11:33:52
1.3K0
举报

前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。

代码语言:javascript
复制
class Difference:
    def __init__(self, nums):
        self.nums = nums
        self.diff = self.make_diff(self.nums)

    def make_diff(self, nums):
        diff = [0 for _ in range(len(nums))]
        diff[0] = nums[0]
        for i in range(1,len(nums)):
            diff[i] = nums[i] - nums[i-1]
        return diff

    # 给闭区间[i,j]增加val
    # 原理很简单,回想diff数组反推nums数组的过程,diff[i] += 3意味着给nums[i..]所有的元素都加了 3,然后diff[j+1] -= 3又意味着对于nums[j+1..]所有元素再减 3,那综合起来,是不是就是对nums[i..j]中的所有元素都加 3 了?
    def increment(self, i, j, val):
        self.diff[i] += val
        if j + 1 < len(self.diff):
            self.diff[j + 1] -= val

    def recover(self):
        rdiff = [0 for _ in range(len(self.diff))]
        rdiff[0] = self.diff[0]
        for i in range(1,len(self.nums)):
            rdiff[i] = rdiff[i-1] + self.diff[i]
        return rdiff



difference = Difference([8,5,9,6,1])
print(difference.diff)
rdiff = difference.recover()
print(rdiff)
difference.increment(2,3,1)
print(difference.diff)
rdiff = difference.recover()
print(rdiff)

结果: [8, -3, 4, -3, -5] [8, 5, 9, 6, 1] [8, -3, 5, -3, -6] [8, 5, 10, 7, 1] 不妨去试试力扣第 1109 题「航班预订统计]。

labuladong的算法小抄

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档