本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、题目描述:
1109. 航班预订统计 - 力扣(LeetCode) (leetcode-cn.com)
这里有 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 * 10^4
- 1 <= bookings.length <= 2 * 10^4
- bookings[i].length == 3
- 1 <= firsti <= lasti <= n
- 1 <= seatsi <= 10^4
二、思路分析:
记原数组为nums,则差分数组diffs定义:
i=0时,diffs[i] = nums[i];
1<=i<n时,diffs[i] = nums[i] - nums[i-1];
如果要对区间[i, j]中的每个元素加k,则按如下方式更新diffs即可:
diffs[i] += k;
如果j+1<n,则diffs[j+1] -=k;
最后将diffs还原成nums:
依次将diffs[i] 更新为 diffs[i-1] + diffs[i]即可。
如果要频繁对数组的子数组中的元素做加减操作,适合用差分数组,如果要频繁对数组的子数组中的元素求和,则适合前缀和。
三、AC 代码:
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] diffs = new int[n];
for (int i = 0; i < bookings.length; i++) {
int left = bookings[i][0];
int right = bookings[i][1];
int seats = bookings[i][2];
diffs[left - 1] += seats;
if (right < n) {
diffs[right] -= seats;
}
}
for (int i = 1; i < diffs.length; i++) {
diffs[i] = diffs[i - 1] + diffs[i];
}
return diffs;
}
}