1. 程式人生 > 其它 >Q1109. 航班預訂統計

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;
    }