数组-数飞机-中等

描述
给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?
如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。
您在真实的面试中是否遇到过这个题?  是
样例

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

题目链接

分析

    该题目和156.合并数组的题目很类似,开始的时候,我们需要对起飞的时间进行排序。对每次起飞的时间,我们将降落的时间放进一个小根堆里面。对下一次起飞的时候,我们判断这个小根堆堆顶的时间是否包含于这个起飞的时候,如果包含,这将这次的降落时间加入;否则则删除这个降落时间,直到包含为止。

程序

/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 * }
 */
//156.合并区间
class Solution {
public:
    /**
     * @param airplanes: An interval array
     * @return: Count of airplanes are in the sky.
     */
    static bool cmp(const Interval &a, const Interval &b){
        return (a.start < b.start);
    }
    int countOfAirplanes(vector<Interval> &airplanes) {
        // write your code here
        if(airplanes.empty())
            return 0;
        if(airplanes.size() == 1)
            return 1;
        sort(airplanes.begin(), airplanes.end(), cmp);
        int max_count = 1;
        priority_queue<int,vector<int>,greater<int> > q; //定义小根堆
        q.push(airplanes[0].end);
        for(int i = 1; i < airplanes.size(); i++){
            if(q.top() > airplanes[i].start)
                q.push(airplanes[i].end);
            else{
                while(!q.empty() && q.top() <= airplanes[i].start)
                    q.pop();
                q.push(airplanes[i].end);
            }
                
            max_count = max_count < q.size() ? q.size() : max_count;
        }
        return max_count;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80764832