这里有 n
个航班,它们分别从 1
到 n
进行编号。
有一份航班预订表 bookings
,表中第 i
条预订记录 bookings[i] = [firsti, lasti, seatsi]
意味着在从 firsti
到 lasti
(包含 firsti
和 lasti
)的 每个航班 上预订了 seatsi
个座位。
请你返回一个长度为 n
的数组 answer
,其中 answer[i]
是航班 i
上预订的座位总数。
示例 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为例:
/**
* 前缀和
*
* @param bookings
* @param n
* @return
*/
public static int[] corpFlightBookings(int[][] bookings, int n) {
if (bookings == null || bookings.length == 0) return new int[]{};
// diff[i] 保存航班i相对于航班i-1处的变化,差分数组
int[] diff = new int[n + 2];
// 左端点+seatsi,右端点后面-seatsi,中间的状态不变,就省了给每个位置更新的时间
for (int[] booking : bookings) {
diff[booking[0]] += booking[2];
diff[booking[1] + 1] -= booking[2];
}
// 前缀和
int[] prefixSum = new int[n + 1];
for (int i = 1; i <= n; i++) {
diff[i] += diff[i - 1];
prefixSum[i - 1] = diff[i];
}
return Arrays.copyOf(prefixSum, n);
}
测试用例
public static void main(String[] args) {
int[][] bookings = new int[][]{{1, 2, 10}, {2, 3, 20}, {2, 5, 25}};
int n = 5;
int[] ans = CorpFlightBookings.corpFlightBookings(bookings, n);
System.out.print("CorpFlightBookings demo01 result : ");
for (int tmp : ans) {
System.out.print("," + tmp);
}
System.out.println();
bookings = new int[][]{{1, 2, 10}, {2, 2, 15}};
n = 2;
ans = CorpFlightBookings.corpFlightBookings(bookings, n);
System.out.print("CorpFlightBookings demo02 result : ");
for (int tmp : ans) {
System.out.print("," + tmp);
}
System.out.println();
}