目录
区间加法
题目介绍
假设你有一个长度为 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);
}
};