LeetCode-Python-1109. 航班预订统计

664 篇文章 23 订阅
本文介绍了一种高效解决区间加法问题的方法,通过优化处理航班预订记录,避免了直接对整个区间进行操作导致的时间复杂度过高。具体地,通过对区间的起始和结束点进行标记,再利用前缀和计算最终结果,有效降低了计算复杂度。
摘要由CSDN通过智能技术生成

这里有 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]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值