https://leetcode-cn.com/problems/corporate-flight-bookings/
思路:最简单的想法,遍历每个区间修改座位数,那么总复杂度可能达到
O
(
n
2
)
O(n^2)
O(n2),大概率会超时。如果你学过线段树/树状数组的话,也可以用
O
(
n
l
g
n
)
O(nlgn)
O(nlgn)的复杂度解决这个问题,就是一个区间修改和单点查询嘛。但是我们有更加巧妙的复杂度为
O
(
n
)
O(n)
O(n)的差分算法。假设最终所求数组为
a
n
s
ans
ans,我们可以计算其差分数组:
d
i
f
f
0
=
a
0
,
d
i
f
f
i
=
a
i
−
a
i
−
1
diff_0=a_0,diff_i=a_i-a_{i-1}
diff0=a0,diffi=ai−ai−1。显然有
a
i
=
∑
j
=
0
i
d
i
f
f
j
a_i=\sum_{j=0}^idiff_j
ai=∑j=0idiffj。那么对
a
[
l
.
.
.
r
]
a[l...r]
a[l...r]增加
v
v
v的操作就相当于对
d
i
f
f
l
diff_l
diffl做
+
v
+v
+v操作,对
d
i
r
r
r
+
1
dirr_{r+1}
dirrr+1做
−
v
-v
−v操作。
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> cnt(n+2);
for(const vector<int>& booking:bookings)
cnt[booking[0]]+=booking[2],cnt[booking[1]+1]-=booking[2];
vector<int> ans(n);
int curSeats=0;
for(int i=1;i<=n;i++)
{
curSeats+=cnt[i];
ans[i-1]=curSeats;
}
return ans;
}
};