1109. 航班预订统计
难度中等166收藏分享切换为英文接收动态反馈
这里有 n 个航班,它们分别从 1 到 n 进行编号。
有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。
请你返回一个长度为 n 的数组 answer,其中 answer[i] 是航班 i 上预订的座位总数。
示例 1:
1 | 输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5 |
示例 2:
1 | 输入:bookings = [[1,2,10],[2,2,15]], n = 2 |
提示:
1 <= n <= 2 * 1041 <= bookings.length <= 2 * 104bookings[i].length == 31 <= firsti <= lasti <= n1 <= seatsi <= 104
通过次数29,555
提交次数58,030
差分数组
差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。
比如说,我给你输入一个数组 nums,然后又要求给区间 nums[2..6] 全部加 1,再给 nums[3..9] 全部减 3,再给 nums[0..4] 全部加 2,再给…
这里就需要差分数组的技巧,类似前缀和技巧构造的 prefix 数组,我们先对 nums 数组构造一个 diff 差分数组,diff[i] 就是 nums[i] 和 nums[i-1] 之差:
1 | int[] diff = new int[nums.length]; |
通过这个 diff 差分数组是可以反推出原始数组 nums 的,代码逻辑如下:
1 | int[] res = new int[diff.length]; |
这样构造差分数组 diff**,就可以快速进行区间增减的操作**,如果你想对区间 nums[i..j] 的元素全部加 3,那么只需要让 diff[i] += 3,然后再让 diff[j+1] -= 3 即可:
参考文献:
本题解法:
1 | class Solution { |