Leetcode 1109:航班预订统计(超详细的解法!!!)

这里有 n 个航班,它们分别从 1n 进行编号。

我们这儿有一份航班预订表,表中第 i 条预订记录 bookings[i] = [i, j, k] 意味着我们在从 ij 的每个航班上预订了 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,然后对于每个区间[i,j]将相应的k加到结果数组中。

class Solution:
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        res = [0] * n
        for i, j, k in bookings:
            for t in range(i-1, j):
                res[t] += k
        return res

不出意料这么做提交超时了。

实际上这个问题是考察差分序列的知识。我们看这样一个例子,对于一个数组[1,2,3,4,5],我们来计算这个数组的差分序列,也就是s[i+1]-s[i],其中0<=i

src : 1 2 3 4 5
dif : 1 1 1 1 1

现在如果我们对src的一段区间做加减操作,实际上可以通过dif数组完成。例如,对区间[1,3]2,实际上就是对dif[1]+=2,对dif[4]-=2

src : 1 4 5 6 5
dif : 1 3 1 1 -1

为什么呢?我们知道将dif向后累加即可得到src,我们只需验证一下上面的操作是不是正确的即可,显然是正确的。这就非常好了,我们这个问题就可以使用这个性质去做。

class Solution:
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        res = [0] * (n + 1)
        for i, j, k in bookings:
            res[i-1] += k
            res[j] -= k
        for i in range(1, len(res)):
            res[i] += res[i-1]
        return res[:-1]

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

你可能感兴趣的:(Problems,leetcode解题指南,leetcode)