Q1109. 航班預訂統計
1109. 航班預訂統計
題目描述
這裡有 n 個航班,它們分別從 1 到 n 進行編號。
有一份航班預訂表 bookings ,表中第 i 條預訂記錄 bookings[i] = [firsti, lasti, seatsi] 意味著在從 firsti 到 lasti (包含 firsti 和 lasti )的 每個航班 上預訂了 seatsi 個座位。
請你返回一個長度為 n 的陣列 answer,其中 answer[i] 是航班 i 上預訂的座位總數。
示例 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]
分析
一、暴力
由題目可知,遍歷每個bookings,將seats數新增到ans陣列對應firsti到lasti的位置,時間複雜度為O(n2>)。
public int[] corpFlightBookings(int[][] bookings, int n) { int[] ans = new int[n]; for (int[] booking : bookings) { for(int i =booking[0]-1; i<=booking[1]-1;i++){ ans[i]+=booking[2]; } } return ans; }
二、差分
注意到一個預訂記錄實際上代表了一個區間的增量。我們的任務是將這些增量疊加得到答案。因此,我們可以使用差分解決本題。
差分陣列對應的概念是字首和陣列,對於陣列 [1,2,2,4][1,2,2,4],其差分陣列為 [1,1,0,2][1,1,0,2],差分陣列的第 i個數即為原陣列的第 i-1個元素和第 i個元素的差值,也就是說我們對差分陣列求字首和即可得到原陣列。
差分陣列的性質是,當我們希望對原陣列的某一個區間 [l,r][l,r] 施加一個增量inc 時,差分陣列 d 對應的改變是:d[l] 增加 inc,d[r+1] 減少 inc。這樣對於區間的修改就變為了對於兩個位置的修改。並且這種修改是可以疊加的,即當我們多次對原陣列的不同區間施加不同的增量,我們只要按規則修改差分陣列即可。
public int[] corpFlightBookingsRe(int[][] bookings, int n) {
int[] ans = new int[n];
for(int[]booking :bookings){
ans[booking[0]-1]+=booking[2];
if(booking[1]<=n-1){
ans[booking[1]]-=booking[2];
}
}
for (int i = 1; i < n; i++) {
ans[i] =ans[i]+ans[i-1];
}
return ans;
}