zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    java RSA 加签验签【转】
    json遍历 分别使用【原】
    oracle 递归和connect by【转】
    css before after基本用法【转】
    Java Web基础——Action+Service +Dao三层的功能划分
    JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
    UUID
    在ssh框架中service-action-jsp-formbeam-dao的调用顺序
    Singleton模式(单例模式)
    真正理解、区分Action,Service和Dao功能
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13059911.html
Copyright © 2011-2022 走看看