定义
差分对于一个数组中的数据来说,他就是让数组的每一项分别与前一项做差,得到一个每一项与前一项的关系
对最后的差分数组而言,他的第一项和原本数据的第一项相同,相当于arr[0] - 0
;而与原数组相比,又多了一项,相当于0 - arr[n-1]
。
所以说,根据差分数组,可以从第二项开始,从前向后逆推出原本的数据;arr[i] = arr[i] + arr[i−1]
应用场景
给出n长度的数组,再给出m个相交的区间,让对这些区间中的数据进行+1操作
再告诉数据范围是1 <= n <= 105
,也就是说想要在1s
中得到结果,那么时间复杂度就得是O( n )
解决方法 | 时间复杂度 |
---|---|
暴力 | O(n^2) |
线段树或者树状数组 | O(mlogn) |
差分 | O(n) |
1109. 航班预订统计
https://leetcode-cn.com/problems/corporate-flight-bookings/
对于座位来说,[2,5,25]
表示在2号航班,3号航班,4号航班,5号航班都预定25个座位,到6号航班(假设)的时候就没有这25个座位了。
bookings[i] = [i, j, k]
表示在 i 站
增加 k 人
即 ans[i-1] += k
;在 j+1 站
减少 k 人
,即 ans[j] -= k
(因为需要返回的结果中,0号下标代表1站)
每站总人数: 前一站人数加上当前人数变化ans[i] += ans[i - 1]
程序实现
对于最后一站的航班,就不需要再额外计算了,因为之后的座位数就是0
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings,<