给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?
注意事项
如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。
对于每架飞机的起降时间列表:[[1,10],[2,3],[5,8],[4,7]]
,
返回3
。
我的思路:建立一个数组对应所有时刻,如果飞机起降时间为[1,10]则对元素1-9采取加1操作
统计完所有飞机后,返回数组的最大值。
class Solution {
public:
/**
* @param intervals: An interval array
* @return: Count of airplanes are in the sky.
*/
int countOfAirplanes(vector<Interval> &airplanes) {
// write your code here
int max = 0;
int n = airplanes.size();
if(n == 0)
return 0;
for(int i=0; i<n; i++)
{
if(airplanes[i].end>max)
max = airplanes[i].end;
}
vector<int> count(max,0);
for(int i=0; i<n; i++)
{
for(int j = airplanes[i].start; j<airplanes[i].end; j++)
count[j]++;
}
return *max_element(begin(count), end(count));
}
};
网上其他较好的办法,采用了set以及map结构:
- class Solution {
- public:
- int countOfAirplanes(vector<Interval> &airplanes) {
- if(airplanes.empty())
- return 0;
- map<int,int> count;
- set<int> base;
- for(auto &e:airplanes){
- ++count[e.start]; //e.start时刻天上飞机增加一架
- --count[e.end]; //e.end时刻天上飞机减少一架
- base.insert(e.start); //把所有起飞,降落的时刻都排序,所以用set
- base.insert(e.end);
- }
- int cur=0,mx=0;
- for(auto &e:base){ //此时base中的时刻成升序排列,即e是逐渐增大
- cur+=count[e]; //cur用来记录当前(即e时刻)天上飞机的总数量
- mx=max(cur,mx);
- }
- return mx;
- }
- };