LeetCode 1109 航班预订统计

LeetCode 1109 航班预订统计

题目

这里有 n 个航班,它们分别从 1n 进行编号。

我们这儿有一份航班预订表,表中第 i 条预订记录 bookings[i] = [i, j, k] 意味着我们在从 ij 的每个航班上预订了 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

法一:暴力法

时间复杂度O(m*n)不出意外超时了

class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        vector<int> res(n,0);
        for(int i=0;i<bookings.size();i++)
        for(int j=bookings[i][0];j<=bookings[i][1];j++)
            res[j-1]+=bookings[i][2];
         return res;
    }
};

法二:差分法

用差分数组记录相邻2个数的差,可以在O(n)的时间内求出一个数组中的数

可以把每个航班类比成公交车的每一站,bookings [1,2,10]表示第一站10人上车,第三站这10人下车,中间人数没变,即第二站车上的人和第一站10人上车后人数一样

用一个数列d记录每个航班与前一个航班相比座位的的变化量, 遍历bookings[i] = [i, j, k] ,d[i]+=k,d[j+1]-=k

最终答案是前一个航班上的人数加上这一个航班人数的变化量

class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        vector<int> res(n,0);
        vector<int> d(n,0);
        for(int i=0;i<bookings.size();i++) {
            d[bookings[i][0]-1]+=bookings[i][2];
            if(bookings[i][1]!=n)
                d[bookings[i][1]]-=bookings[i][2];
        }
        res[0]=d[0];
        for(int i=1;i<n;i++)
            res[i]=res[i-1]+d[i];
        return res;
    }
}; 

改进版:只用一个数组

class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        vector<int> res(n,0);
        for(int i=0;i<bookings.size();i++) {
            res[bookings[i][0]-1]+=bookings[i][2];
            if(bookings[i][1]!=n)
                res[bookings[i][1]]-=bookings[i][2];
        }
        for(int i=1;i<n;i++)
            res[i]=res[i-1]+res[i];
        return res;
    }
};
posted @ 2020-03-31 11:17  iClaire  阅读(410)  评论(0编辑  收藏  举报