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