LintCode –number-of-airplanes-in-the-sky(数飞机)
原题链接:http://www.lintcode.com/zh-cn/problem/number-of-airplanes-in-the-sky/
给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?
样例
对于每架飞机的起降时间列表:[[1,10],[2,3],[5,8],[4,7]], 返回3。
注意
如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。
思路分析:
首先建立一个数组来模拟时间轴,某个时间起飞就将该处的值加1,在某个时间点降落就将该处的值置为-1.这样我们求天上最多有多少架飞机,就是求数组某一段的和最大即1的个数最多也即此时在天上飞机的个数,这样就将问题简化的很简单了。
代码如下:
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*/
class Solution {
public:
/*
* @param airplanes: An interval array
* @return: Count of airplanes are in the sky.
*/
static bool comp(const Interval& a, const Interval& b){
return a.start < b.start;
}
int countOfAirplanes(vector<Interval> &airplanes)
{
// write your code here
int n = airplanes.size();
if (n <= 1) return n;
int max = airplanes[0].end; //获取最大值即时间轴的远端
for (int i = 0; i < n; i++)
if (airplanes[i].end > max)
max = airplanes[i].end;
int * count = new int [max+1]; //建立时间轴
for (int i = 0; i < max ; i++)
count[i] = 0;
for (int i = 0; i < n; i++){ //将飞机起飞和降落在时间轴上表现出来
count[airplanes[i].start] += 1;
count[airplanes[i].end] -= 1;
}
int res = 0, t = 0; //求子序列和最大的问题即飞机数最多
for (int i = 0; i < max; i++){
t += count[i];
if (t > res) res = t;
}
return res;
}
};