版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/79322383
好久没有写博客。还有一个小时就从深圳回家过年,闲着没事就去LintCode随机找了道题练练手。
题目描述:
给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?(如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。)
样例:
对于每架飞机的起降时间列表:[[1,10],[2,3],[5,8],[4,7]], 返回3。
分析
这道题目挺有意思,看到它的第一反应是开一个数组区间表示每个时刻的飞机数量。这个解法的优点是相当直观,因为数组的每个元素对应一个时刻的飞机数量,容易让人理解;缺点是当区间范围很大的时候时间空间复杂度都太大,比如区间的单位是纳秒,1小时=3600000000000纳秒,存这个区间就需要占用3T多的内存,显然不可行。于是需要优化,从哪里优化?自然是从缺点开始优化。缺点是什么造成的?仔细想想会发现我们存储了许多不必要的信息,存储了每个时刻的飞机数量,存储的是全量信息,既浪费了时间也浪费了空间。而真正影响每个时刻飞机数量的因素是区间的两个端点。于是优化思路就出来了:1.只关注区间的端点所在的时刻;2.存储增量信息而不是全量信息。
于是在这两点因素的考量下,很容易写出下面这段AC代码:
AC代码
/**
* 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.
*/
int countOfAirplanes(vector<Interval> &airplanes) {
int result = 0;
map<int, int> countOfMomentMp;
for (auto& itv : airplanes) {
++countOfMomentMp[itv.start];
--countOfMomentMp[itv.end];
}
int countOfMoment = 0;
for (auto& v : countOfMomentMp) {
countOfMoment += v.second;
result = max(result, countOfMoment);
}
return result;
}
};
思考:
练习一道题,最没有价值的往往是正确答案,真正有用的是你对题目的思考,在思考之中将过往的经验和新的知识联系起来,巩固并扩展自己的知识网络,只有这样才谈得上有收获。