1109. Corporate Flight Bookings

问题:

给定一个航班预定列表,每一项为 [i, j, k],意思是从 i ~ j 航班,每个航班都需要预定k个座位。

一共有n个航班,即 1<=i<=j<=n,求满足这个列表的航班1~n的座位数列表。

Example 1:
Input: bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
Output: [10,55,45,25,25]
 

Constraints:
1 <= bookings.length <= 20000
1 <= bookings[i][0] <= bookings[i][1] <= n <= 20000
1 <= bookings[i][2] <= 10000

解法:

用一般的遍历bookings列表,去填充res的i~j累加k,会超时。约为bookings的size*res的size的时间。

因此,需要简化遍历时间。

尽量只遍历一次bookings 和 res

可使用累加法:

对每一个bookings[i,j,k]来说,

res[i]=k,res[i+1]=k... res[j]=k,res[j+1]=0...res[n]=0;

可转换为:(怎样做到,对遍历一个bookings[i,j,k],标记后,用标记的数量,遍历res一次,直接可得到结果)

res[i]=k,res[i+1]=res[i]... res[j]=res[j-1],res[j+1]=res[j]-k...res[n]=res[n-1];

每次记录一个增减变化,res[i]的时候增加了k,然后一直保持不变,到res[j+1]的时候减少k,然后保持不变,到最后。

这样多个记录累加,同样是,

在res[i]的时候,多个增加k,k1,k2...,中间可能有减少一些k1,k2,对于总结果,只有增减的变化,对结果有影响,否则,一直会和上一个值res[i-1]保持不变。

因此,我们在遍历bookings的时候,把第 i 位增,和第 j 位减 的变化记录在res结果中,

在遍历res的时候,累加这些变化即可。

代码参考:

 1 class Solution {
 2 public:
 3     vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
 4         vector<int> res(n, 0);
 5         for(vector<int> book:bookings){
 6             res[book[0]-1]+=book[2];
 7             if(book[1]<n) res[book[1]]-=book[2];
 8         }
 9         for(int i=1;i<n;i++){
10             res[i]+=res[i-1];
11         }
12         return res;
13     }
14 };
原文地址:https://www.cnblogs.com/habibah-chang/p/13059911.html