问题描述
这里有
n
个航班,它们分别从1
到n
进行编号。有一份航班预订表
bookings
,表中第i
条预订记录bookings[i] = [firsti, lasti, seatsi]
意味着在从firsti
到lasti
(包含firsti
和lasti
)的 每个航班 上预订了seatsi
个座位。请你返回一个长度为
n
的数组answer
,里面的元素是每个航班预定的座位总数。
示例
示例 1:
输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5 输出:[10,55,45,25,25] 解释: 航班编号 1 2 3 4 5 预订记录 1 : 10 10 预订记录 2 : 20 20 预订记录 3 : 25 25 25 25 总座位数: 10 55 45 25 25 因此,answer = [10,55,45,25,25]示例 2:
输入:bookings = [[1,2,10],[2,2,15]], n = 2 输出:[10,25] 解释: 航班编号 1 2 预订记录 1 : 10 10 预订记录 2 : 15 总座位数: 10 25 因此,answer = [10,25]提示:
1 <= n <= 2 * 104
1 <= bookings.length <= 2 * 10^4
bookings[i].length == 3
1 <= firsti <= lasti <= n
1 <= seatsi <= 10^4
问题分析:
这道题算是我第一次接触差分思想。特别记录一下。大致解题思路就是,我们要明白,能使得最终结果产生变化的,只有每张预定表的第一个座位和结束的位置下一个座位。
代码如下:
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
//扩大差分数组,防止溢出
vector<int> diff(n + 2, 0);
vector<int> res;
//差分过程
for (int i = 0; i < bookings.size(); i ++) {
diff[bookings[i][0]] += bookings[i][2];
diff[bookings[i][1] + 1] -= bookings[i][2];
}
//前缀和即为结果
int prefix = 0;
for (int i = 1; i <= n; i++) {
prefix += diff[i];
res.push_back(prefix);
}
return res;
}
};