【数组Array】力扣-370 区间加法

2023-12-18 17:23:59

目录

问题描述

labuladong题解


问题描述

假设你有一个长度为?n?的数组,初始情况下所有的数字均为?0,你将会被给出?k????????个更新的操作。

其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc],你需要将子数组?A[startIndex ... endIndex](包括 startIndex 和 endIndex)增加?inc

请你返回?k?次操作后的数组。

示例:

输入: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]]
输出: [-2,0,3,5,3]

解释:

初始状态:
[0,0,0,0,0]

进行了操作 [1,3,2] 后的状态:
[0,2,2,2,0]

进行了操作 [2,4,3] 后的状态:
[0,2,5,5,3]

进行了操作 [0,2,-2] 后的状态:
[-2,0,3,5,3]

labuladong题解

构造差分数组,差分数组中diff[i] = nums[i] - nums[i-1],当改变某一区间内所有值时,其内部的差值是不变的,只有头尾发生改变,这样,极大的简降低了搜索的复杂度。

代码如下:

# 注意:labuladong代码

# 差分数组工具类
class Difference:
    # 差分数组
    def __init__(self, nums: List[int]):
        assert len(nums) > 0
        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


def getModifiedArray(length: int, updates: List[List[int]]) -> List[int]:
    # nums 初始化为全 0
    nums = [0] * length
    # 构造差分解法
    df = Difference(nums)
    
    for update in updates:
        i, j, val = update[0], update[1], update[2]
        df.increment(i, j, val)
    
    return df.result()

只学习一下吧,没有开力扣会员,哈哈。

文章来源:https://blog.csdn.net/weixin_42672331/article/details/135063637
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。