LintCode 391: Count Of Airplanes

LintCode 391: Count Of Airplanes

题目描述

给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?

样例

对于每架飞机的起降时间列表:[[1,10],[2,3],[5,8],[4,7]], 返回3

Thu Feb 23 2017

思路

这道题思路很容易想到,即将飞机起飞降落的过程模拟一遍,即可得到最大飞机数。

首先将Interval序列按照起飞时间排序,以及再按照降落时间排序,然后从最早起飞时间到最晚降落时间遍历,降落一架飞机,计数器减一,起飞一家飞机,计数器加一。

时间复杂度是\(O(n+m)\),从复杂度上是最优的了,但是本题还有更好的方法,以后再补吧。

代码

// 数飞机
// 用于排序起飞时间的比较函数
static bool cmp_start(const Interval& x, const Interval& y)
{
    return x.start < y.start;
}

// 用于排序降落时间的比较函数
static bool cmp_end(const Interval& x, const Interval& y)
{
    return x.end < y.end;
}

// 主执行函数
int countOfAirplanes(vector<Interval> &airplanes) 
{
    if (airplanes.size() <= 0) return 0;
    vector<Interval> airplanes_start(airplanes);
    vector<Interval> airplanes_end(airplanes);
    sort(airplanes_start.begin(), airplanes_start.end(), cmp_start);
    sort(airplanes_end.begin(), airplanes_end.end(), cmp_end);

    int max_count = -1, now_count = 0;
    int start_index = 0, end_index = 0;
    for (int i = airplanes_start.begin()->start; i < (airplanes_end.end() - 1)->end; ++i)
    {
        if (airplanes_end[end_index].end == i)
        {
            --now_count;
            ++end_index;
        }
        else if (airplanes_start[start_index].start == i)
        {
            ++now_count;
            ++start_index;
        }
        else continue;
        if (now_count > max_count) max_count = now_count;
        // 由于在一个时间点可能同时有降落和起飞,所以需要回退一次
        --i;
    }
    return max_count;

}
posted @ 2017-02-23 16:36  GenkunAbe  阅读(244)  评论(0编辑  收藏  举报