題目描述
這裏有 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;
}
}