There are n
flights that are labeled from 1
to n
.
You are given an array of flight bookings bookings
, where bookings[i] = [firsti, lasti, seatsi]
represents a booking for flights firsti
through lasti
(inclusive) with seatsi
seats reserved for each flight in the range.
Return *an array answer
of length n
, where answer[i]
is the total number of seats reserved for flight *i
.
Example 1:
Input: bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
Output: [10,55,45,25,25]
Explanation:
Flight labels: 1 2 3 4 5
Booking 1 reserved: 10 10
Booking 2 reserved: 20 20
Booking 3 reserved: 25 25 25 25
Total seats: 10 55 45 25 25
Hence, answer = [10,55,45,25,25]
Example 2:
Input: bookings = [[1,2,10],[2,2,15]], n = 2
Output: [10,25]
Explanation:
Flight labels: 1 2
Booking 1 reserved: 10 10
Booking 2 reserved: 15
Total seats: 10 25
Hence, answer = [10,25]
Constraints:
1 <= n <= 2 * 104
1 <= bookings.length <= 2 * 104
bookings[i].length == 3
1 <= firsti <= lasti <= n
1 <= seatsi <= 104
這道題說是有n個航班,標號從1到n,每次公司可以連續預定多個航班上的座位,用一個三元數組 [i, j, k],表示分別預定航班i到j上的k個座位,最后問每個航班上總共被預定了多少個座位。博主先試了一下暴力破解,毫無意外的超時了,想想為啥會超時,因為對於每個預定的區間,都遍歷一次的話,最終可能達到n的平方級的復雜度。所以就需要想一些節省運算時間的辦法,其實這道的解法很巧妙,先來想想,假如只有一個預定,是所有航班上均訂k個座位,那么暴力破解的方法就是從1遍歷到n,然后每個都加上k,但還有一種方法,就是只在第一天加上k,然后計算累加和數組,這樣之后的每一天都會被加上k。如果是預定前一半的航班,那么暴力破解的方法就是從1遍歷到 n/2,而這里的做法是在第一個天加上k,在第 n/2 + 1 天減去k,這樣再求累加和數組時,后一半的航班就不會加上k了。對於所有的預定都可以采用這種做法,在起始位置加上k,在結束位置加1處減去k,最后再整體算累加和數組,這樣就把平方級的時間復雜度縮小到了線性,完美通過 OJ,參見代碼如下:
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> res(n);
for (auto booking : bookings) {
res[booking[0] - 1] += booking[2];
if (booking[1] < n) res[booking[1]] -= booking[2];
}
for (int i = 1; i < n; ++i) {
res[i] += res[i - 1];
}
return res;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/1109
參考資料:
https://leetcode.com/problems/corporate-flight-bookings/
https://leetcode.com/problems/corporate-flight-bookings/discuss/328871/C%2B%2BJava-with-picture-O(n)
https://leetcode.com/problems/corporate-flight-bookings/discuss/328856/JavaC%2B%2BPython-Sweep-Line