LintCode.391.数飞机

版权声明:长风原创 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;
    }
};

思考:

练习一道题,最没有价值的往往是正确答案,真正有用的是你对题目的思考,在思考之中将过往的经验和新的知识联系起来,巩固并扩展自己的知识网络,只有这样才谈得上有收获。

猜你喜欢

转载自blog.csdn.net/u012846486/article/details/79322383