• 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 };
  • 相关阅读:
    简单的几句接口调用,完美完成缩短网站
    nodejs语言实现验证码生成功能
    人工智能:文本相似度分析
    SolrCloud 5.2.1 installation and configuration
    借鉴DP思想: HouseRobberIII
    有意思的数学题:Trapping Rain Water
    API认证方法一览
    FE: Responsive Web Design Overview
    FE: Sass and Bootstrap 3 with Sass
    假期小记:14年寒假二三四事(儿)
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13059911.html
Copyright © 2020-2023  润新知