问题:
给定一个航班预定列表,每一项为 [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 };