LeetCode 1109 航班预订统计
LeetCode 1109 航班预订统计
题目
这里有 n
个航班,它们分别从 1
到 n
进行编号。
我们这儿有一份航班预订表,表中第 i
条预订记录 bookings[i] = [i, j, k]
意味着我们在从 i
到 j
的每个航班上预订了 k
个座位。
请你返回一个长度为 n
的数组 answer
,按航班编号顺序返回每个航班上预订的座位数。
示例:
输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
提示:
1 <= bookings.length <= 20000
1 <= bookings[i][0] <= bookings[i][1] <= n <= 20000
1 <= bookings[i][2] <= 10000
法一:暴力法
时间复杂度O(m*n)不出意外超时了
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> res(n,0);
for(int i=0;i<bookings.size();i++)
for(int j=bookings[i][0];j<=bookings[i][1];j++)
res[j-1]+=bookings[i][2];
return res;
}
};
法二:差分法
用差分数组记录相邻2个数的差,可以在O(n)的时间内求出一个数组中的数
可以把每个航班类比成公交车的每一站,bookings [1,2,10]表示第一站10人上车,第三站这10人下车,中间人数没变,即第二站车上的人和第一站10人上车后人数一样
用一个数列d记录每个航班与前一个航班相比座位的的变化量, 遍历bookings[i] = [i, j, k]
,d[i]+=k,d[j+1]-=k
最终答案是前一个航班上的人数加上这一个航班人数的变化量
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> res(n,0);
vector<int> d(n,0);
for(int i=0;i<bookings.size();i++) {
d[bookings[i][0]-1]+=bookings[i][2];
if(bookings[i][1]!=n)
d[bookings[i][1]]-=bookings[i][2];
}
res[0]=d[0];
for(int i=1;i<n;i++)
res[i]=res[i-1]+d[i];
return res;
}
};
改进版:只用一个数组
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> res(n,0);
for(int i=0;i<bookings.size();i++) {
res[bookings[i][0]-1]+=bookings[i][2];
if(bookings[i][1]!=n)
res[bookings[i][1]]-=bookings[i][2];
}
for(int i=1;i<n;i++)
res[i]=res[i-1]+res[i];
return res;
}
};