航班預訂統計

題目描述 

這裏有 n 個航班,它們分別從 1 到 n 進行編號。

我們這兒有一份航班預訂表,表中第 i 條預訂記錄 bookings[i] = [i, j, k] 意味着我們在從 i 到 j 的每個航班上預訂了 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

解題思路 

  • 換一種思路理解題意,將問題轉換爲:某公交車共有 n 站,第 i 條記錄 bookings[i] = [i, j, k] 表示在 i 站上車 k 人,乘坐到 j 站,在 j+1 站下車,需要按照車站順序返回每一站車上的人數
  上車 下車 車上人數
第一站 10 0 10
第二站 20+25 0 10+55=55
第三站 0 10 55-10=45
第四站 0 20 45-20=25
第五站 0 0 25
  • 根據 1 的思路,定義 counter[] 數組記錄每站的人數變化,即上車和下車人數的差值,counter[i] 表示第 i+1 站。遍歷 bookings[]:bookings[i] = [i, j, k] 表示在 i 站增加 k 人即 counter[i-1] += k,在 j+1 站減少 k 人即 counter[j] -= k
  • 遍歷(整理)counter[] 數組,得到每站總人數: 每站的人數爲前一站人數加上當前人數變化 counters[i] += counters[i - 1]

 完整代碼

class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
         // 定義n維數組,用於存儲每站上車和下車人數的差值
        int[] counter = new int[n];

        for (int[] booking : bookings) {
            // 上車人數
            counter[booking[0] - 1] += booking[2];
            // 下車人數
            if (booking[1] < n) {
                counter[booking[1]] -= booking[2];
            }
        }
        // 遍歷數組,每一站人數爲上一站人數+本站上車和下車差值
        for (int i = 1; i < n; i++) {
            counter[i] += counter[i - 1];
        }
        return counter;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章