1109. 航班預訂統計(中)

Frommoon發表於2024-03-27

目錄
  • 題目
  • 題解:差分陣列

題目

  • 這裡有 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]

題解:差分陣列

class Solution:
    class Difference:
    # 差分陣列
        def __init__(self, nums: List[int]):
            assert len(nums) > 0
            self.diff = [0] * len(nums)
            # 根據初始陣列構造差分陣列
            self.diff[0] = nums[0]
            for i in range(1, len(nums)):
                self.diff[i] = nums[i] - nums[i - 1]

        # 給閉區間 [i, j] 增加 val(可以是負數)
        def increment(self, i: int, j: int, val: int) -> None:
            self.diff[i] += val
            if j + 1 < len(self.diff):
                self.diff[j + 1] -= val

        # 返回結果陣列
        def result(self) -> List[int]:
            res = [0] * len(self.diff)
            # 根據差分陣列構造結果陣列
            res[0] = self.diff[0]
            for i in range(1, len(self.diff)):
                res[i] = res[i - 1] + self.diff[i]
            return res
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        nums=[0]*n
        df= Solution.Difference(nums)
        for book in bookings:
            i,j,val=book[0],book[1],book[2]
            df.increment(i-1,j-1,val)#題目要求n從1開始,陣列下標從0開始
        return df.result()

相關文章