航班预订统计
难度:
标签:
题目描述
代码结果
运行时间: 46 ms, 内存: 27.1 MB
/*
* 题目思路:
* 使用Java Stream的方式实现类似的逻辑。
* 1. 使用一个初始大小为 n 的数组来存储结果。
* 2. 使用流处理每一个预订记录。
* 3. 在第一个索引处加 seats,在最后一个索引的后一个位置减 seats。
* 4. 最后使用累加流来更新结果。
*/
import java.util.Arrays;
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] answer = new int[n];
Arrays.stream(bookings).forEach(booking -> {
int first = booking[0];
int last = booking[1];
int seats = booking[2];
answer[first - 1] += seats;
if (last < n) {
answer[last] -= seats;
}
});
// 累积求和
Arrays.parallelPrefix(answer, Integer::sum);
return answer;
}
解释
方法:
题解使用了差分数组的技巧来解决航班预订统计的问题。首先初始化一个长度为n的数组nums,所有元素初始值为0。对于每条预订记录[l, r, x],在nums的l-1位置加上x(代表从第l个航班开始增加x个座位),并在r位置减去x(代表第r+1个航班开始减少x个座位,这样就不会影响第r个航班)。这样设置后,nums数组的每个位置仅表示从当前位置开始的增量变化。最后,使用累积和函数itertools.accumulate对nums进行处理,得到每个航班的总座位数。
时间复杂度:
O(m + n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在差分数组nums中要在r位置减去x,而不是在r+1位置操作?
▷🦆
差分数组的方法与直接遍历bookings数组更新每个航班的座位数相比,具体有哪些优势?
▷🦆
如果预订记录中的firsti为1,对nums数组的操作有什么特殊考虑吗?
▷🦆
在差分数组nums完成所有预订记录的处理后,为什么累积和能准确地反映每个航班的总座位数?
▷