题目:https://leetcode-cn.com/problems/corporate-flight-bookings/
暴力
- 枚举每条预定记录
- 统计每个航班的预定数
差分
分析
每次预定的时候只有两个地方会导致预定位置数发生变化,即
「预定开始的航班」 和 「预定结束的航班号+1的航班」
开始的地方会导致这个地方增加m个航班,结束的地方不再需要这些位置,所以会减去m个航班。
我们并不需要真的记录每个位置的状态,只需要记录有变化的位置即可,他们所持有的信息其实是一样的。
在「有变化的位置」添加变化的状态,之后以【叠加前面状态】的方式,来持续这个变化的状态
在「变化结束的位置」减去这个变化的状态,还原原来的状态
//官方题解 python 篇
class Solution:
def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
nums = [0] * n
for left, right, inc in bookings:
nums[left - 1] += inc
if right < n:
nums[right] -= inc
for i in range(1, n):
nums[i] += nums[i - 1]
return nums
//官方题解 Java 篇
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;
}
}
//官方题解 JavaScript 篇
var corpFlightBookings = function(bookings, n) {
const nums = new Array(n).fill(0);
for (const booking of bookings) {
nums[booking[0] - 1] += booking[2];
if (booking[1] < n) {
nums[booking[1]] -= booking[2];
}
}
for (let i = 1; i < n; i++) {
nums[i] += nums[i - 1];
}
return nums;
};