这里有 n
个航班,它们分别从 1
到 n
进行编号。
我们这儿有一份航班预订表,表中第 i
条预订记录 bookings[i] = [i, j, k]
意味着我们在从 i
到 j
的每个航班上预订了 k
个座位。
请你返回一个长度为 n
的数组 answer
,按航班编号顺序返回每个航班上预订的座位数。
示例:
输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
提示:
1 <= bookings.length <= 20000
1 <= bookings[i][0] <= bookings[i][1] <= n <= 20000
1 <= bookings[i][2] <= 10000
思路:
第一题已经够简单了,没想到第二题还这么简单,上周才考了拼车(区间加法的变形),没想到这周又考了一遍……
直接开数组按照bookings里的值, 对整段区间都处理,是不可行的,python稳定超时。
为了节省时间,只需在区间起始和结束点进行标记即可,
record[start] += num, record[end + 1] -= num
然后利用前缀和数组计算答案。
举例:
对于输入bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
开一个size为6的数组,初始化为[0, 0, 0, 0, 0, 0]
对于第一条订票记录[1,2,10]代表从航班1到航班2 都订了十张票,在区间上标记为:
[10, 0, -10, 0, 0, 0]
注意航班是从1开始的,不是从0开始的。
对于第二条订票记录[2,3,20]代表从航班2到航班3都订了二十张票,在区间上标记为:
[10, 20, -10, -20, 0, 0]
对于第三条订票记录[2, 5, 25],标记为:
[10, 45, -10, -20, 0, -25]
此时,所有订票记录都处理结束,从前向后使用前缀和的计算方法 record[n] += record[n - 1]处理结果。
[10, 55, 45, 25, 25, 0],然后放弃最后一位不要,因为只是用来处理中间结果的空位。
本题类似LeetCode-Python-1094. 拼车, LeetCode-Python-370. 区间加法, LeetCode-Python-253. 会议室 II
class Solution(object):
def corpFlightBookings(self, bookings, n):
"""
:type bookings: List[List[int]]
:type n: int
:rtype: List[int]
"""
f = [0 for _ in range(n + 1)]
for i, j, k in bookings:
f[i - 1] += k
f[j] -= k
for i in range(1, n + 1):
f[i] += f[i - 1]
return f[:-1]