• leetcode第一刷_Merge Intervals


    看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样。是一段一段的。当时写的那叫一个慘不忍睹。最后果然被拒掉了。

    。好好练习算法,争取正式招聘的时候拒一次微软。哈哈~

    说归说,这道题事实上还是比較简单的。先考虑什么样子的集合是能够合并的。设两段集合是[a, b]和[c, d],不失一般性的,如果a<c,那么有以下几种情况:

    1. b<c,这说明两段是全然不相交的,没办法合并。

    2. b>=c&&b<=d,两段相交了。这个时候新合并出的结合的头应该是a,结尾应该是d。

    3. b>d。也就是后一段全然是前一段的子段,那么合并后的集合应该是[a, b]。

    注意到,要想从头到尾扫一遍就完毕全部的合并。必须实现对全部的段都排一下序,排序的规则是先按起始边界递增,起始边界同样的。依照结束边界递增。实现的时候用传递一个比較函数做參数的库函数就能轻松搞定。排好序之后。从左往右扫。一開始遇到的那一段的起始,一定是新段的起始,然后如果当前的结束位置比遇到的这一段的起始位置大,那说明这两段相交了,结束位置应该延伸到这两段最远的那个端点,然后继续往后找,直到当前段的结束位置比下一段的起始位置还要小,说明两段全然不相交,那么将当前段的结束位置更新为刚刚那个过程中所能延伸到的最远位置。这就完毕了一次合并。

    然后下一次循环时,从合并后的后一段開始。

    代码还是比較简洁的。也非常好理解:

    bool compare(const Interval &a, const Interval &b){
        if(a.start != b.start)
            return a.start<b.start;
        else
            return a.end<b.end;
    }
    class Solution {
    public:
        vector<Interval> merge(vector<Interval> &intervals) {
            int msize = intervals.size();
            vector<Interval> res;
            if(msize == 0)  return res;
            sort(intervals.begin(), intervals.end(), compare);
            Interval itv = intervals[0];
            int i=0, tpmax=0;
            while(i<msize){
                tpmax = itv.end;
                while(i<msize&&tpmax>=intervals[i].start){
                    tpmax = max(tpmax, intervals[i].end);
                    i++;
                }
                itv.end = tpmax;
                if(i==msize){
                    res.push_back(itv);
                    break;
                }
                if(itv.end<intervals[i].start){
                    res.push_back(itv);
                    itv = intervals[i];
                }
            }
            return res;
        }
    };


  • 相关阅读:
    Redis哨兵(Sentinel)模式
    一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗
    Redis 快速入门
    Redis 持久化之RDB和AOF
    Junit 入门使用教程 转自:http://www.cnblogs.com/ysocean/p/6889906.html
    Spring里PropertyPlaceholderConfigurer类的使用 转自:https://www.cnblogs.com/huqianliang/p/5673701.html
    Apache Commons Codec 编码/解码 (Base64/MD5/SHA1/SHA256等算法) 转自https://blog.csdn.net/hbtj_1216/article/details/52813741
    hive中时间日期函数的使用
    关于mat函数
    strip 和split
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10749972.html
Copyright © 2020-2023  润新知