[LeetCode] 1109. Corporate Flight Bookings 公司航班預訂



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


LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM