【区间加法】
创始人
2025-06-01 08:22:58

题目来源: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 getModifiedArray(int length, vector> &updates){vector 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);}
};

相关内容

热门资讯

井冈山特色土特产选购全攻略:从... 井冈山特色土特产选购全攻略:从竹笋到红米,哪里买实惠又正宗? 来井冈山旅游,除了感受红色摇篮的壮丽山...
张店区周边亲子游景点推荐 在忙碌的生活中,亲子游成为了许多家庭增进感情、放松身心的绝佳选择。张店区周边有不少适合亲子游玩的景点...
望江县旅游景点必玩推荐 望江县,这座位于安徽的小城,宛如一颗璀璨的明珠,散发着独特的魅力。它有着丰富的自然景观和深厚的文化底...
春节假期第一天文旅燃盛宴,泉城... 文旅迎新春,欢喜过大年。今天是2月15日,春节假期第一天。市文化和旅游局按照市委、市政府关于丰富假日...
(新春走基层)五台山启动春节假... 中新网忻州2月15日电 (范丽芳 张睿容)2026年新春佳节将至。记者从山西五台山风景名胜区管理委员...