【区间加法】

题目来源:https://leetcode-cn.com/problems/range-addition

目录


区间加法

题目介绍

假设你有一个长度为 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]

思路:
我们脑海中第一时刻想出的肯定是暴力算法,取出updates数组,然后依次对区间进行更新,这样思路简单,但是时间复杂度比较高——O(n^2),显然达不到题目要求的O(n)
好的思路是这样的,利用差分数组,对一个区间[i,j]进行加操作时,我们可以只对起始位置arr[i]进行加常数C的操作,对末尾位置的下一个数arr[j+1]进行减C的操作,这样下来,我们对这块区间求累加和,就是时间区间加操作后的数组,看下面的例子:
在这里插入图片描述

上面是一次操作,我们可以将多次update操作都进行上面一次操作,然后再对整个数据进行求累加和操作,最终就能够得到最终数组
代码实现:

class Solution
{
public:
	vector<int> getModifiedArray(int length, vector<vector<int>> &updates)
    {
        vector<int> ans(length, 0);
        for (auto &update : updates)
        {
            ans[update[0]] += update[2];
            if (update[1] + 1 < length)
                ans[update[1] + 1] -= update[2];
        }
        // 求前最和
        for (int i = 1; i < length; ++i)
        {
            ans[i] += ans[i - 1];
        }
        return move(ans);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆兽学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值