LeetCode 1109.Corporate Flight Bookings
LeetCode 1109. Corporate Flight Bookings (航班预订统计)
题目
链接
https://leetcode-cn.com/problems/corporate-flight-bookings/submissions/
问题描述
这里有 n 个航班,它们分别从 1 到 n 进行编号。
有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。
请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。
示例
输入: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]
提示
1 <= n <= 2 * 104
1 <= bookings.length <= 2 * 104
bookings[i].length == 3
1 <= firsti <= lasti <= n
1 <= seatsi <= 104
思路
差分数组的思路,与1094相似。
首先设置differ数组,存放每个航班和前一个航班的人数差,一直计算完每个booking,之后根据differ数组计算每个航班的人数。这里需要考虑到-1,因为航班号和下标差距是1.
复杂度分析
时间复杂度 O(max(m,n))
空间复杂度 O(n)
代码
Java
public int[] corpFlightBookings(int[][] bookings, int n) {
int []differ = new int[n];
int []ans = new int[n];
for(int [] booking : bookings){
int s = booking[0];
int e = booking[1];
int num = booking[2];
differ[s-1] += num;
if(e<n){
differ[e] -= num;
}
}
ans[0] = differ[0];
for(int i = 1;i<n;i++){
ans[i] = ans[i-1] +differ[i];
}
return ans;
}