差分数组学习

文章介绍了差分数组这一数据结构在处理频繁区间修改问题中的应用,特别是在航班预订统计的问题中。通过差分数组,可以高效地处理区间增加操作并快速恢复原数组。解决方案包括初始化差分数组,实现增加区间值和获取结果数组的方法。
摘要由CSDN通过智能技术生成

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。

# 差分数组工具类
class Difference:
    # 差分数组
    def __init__(self, nums: List[int]):
        self.diff = [0] * len(nums)
        # 根据初始数组构造差分数组
        self.diff[0] = nums[0]
        for i in range(1, len(nums)):
            self.diff[i] = nums[i] - nums[i - 1]

    # 给闭区间 [i, j] 增加 val(可以是负数)
    def increment(self, i: int, j: int, val: int) -> None:
        self.diff[i] += val
        if j + 1 < len(self.diff):
            self.diff[j + 1] -= val

    # 返回结果数组
    def result(self) -> List[int]:
        res = [0] * len(self.diff)
        # 根据差分数组构造结果数组
        res[0] = self.diff[0]
        for i in range(1, len(self.diff)):
            res[i] = res[i - 1] + self.diff[i]
        return res

1109. 航班预订统计

1109. 航班预订统计

class Difference:
    def __init__(self, nums: List[int]):
        n = len(nums)
        self.diff = [0] * n
        self.diff[0] = nums[0]
        for i in range(1, n):
            self.diff[i] = nums[i] - nums[i - 1]

    def increase(self, i, j, value):
        self.diff[i] += value
        if (j + 1) < len(self.diff):
            self.diff[j + 1] -= value

    def result(self) -> List[int]:
        n = len(self.diff)
        ans = [0] * n
        ans[0] = self.diff[0]
        for i in range(1, n):
            ans[i] = ans[i - 1] + self.diff[i]
        return ans



class Solution:
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        nums = [0] * n
        diff = Difference(nums)
        for booking in bookings:
            i = booking[0] - 1
            j = booking[1] - 1
            diff.increase(i, j, booking[-1])
        return diff.result()

参考链接

https://labuladong.gitee.io/algo/di-yi-zhan-da78c/shou-ba-sh-48c1d/xiao-er-me-c304e/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值