# 「力扣」第 1109 题:航班预订统计(中等)
# 题目描述
这里有 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 * 104
bookings[i].length == 3
1 <= firsti <= lasti <= n
1 <= seatsi <= 104
# 差分知识点
输入数组:
定义「差分数组」:
给数组 [left..right]
每个数都加上
,有变化。 ,有变化。
其余
注意:差分数组的最后一个数不能要。
摘要:对数组执行前缀和操作得到「前缀和」数组,对「前缀和」数组执行「差分」操作得到「原始数组」。本题通过「输入数据」在「差分数组」上的操作,进而求解「前缀和」数组,得到「原始数组」。
# 理解题意
输入数组和输出数组可以通过下面的图来理解题意。
解题思路:
本题通过「输入数据」在「差分数组」上的操作,进而求解「前缀和」数组,得到「原始数组」。
参考代码:
public class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] nums = new int[n];
for (int[] booking : bookings) {
nums[booking[0] - 1] += booking[2];
if (booking[1] < n) {
nums[booking[1]] -= booking[2];
}
}
for (int i = 1; i < n; i++) {
nums[i] += nums[i - 1];
}
return nums;
}
}
因为题目中的航班从 1
开始编号,所以这里要注意两个细节:
- 细节 1:处理左边界的时候,下标有一个偏移,所以是
nums[booking[0] - 1] += booking[2];
- 细节 2:处理右边界的时候,由于处理的是
right + 1
,所以不用减(这里没有说得很清楚,相信大家可以明白意思)。
作者:liweiwei1419 链接:https://suanfa8.com/prefix-sum/difference/1109-corporate-flight-bookings 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。