目錄
- 題目
- 題解:差分陣列
題目
-
這裡有 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()