看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的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;
}
};

leetcode第一刷_Merge Intervals的更多相关文章

  1. leetcode第一刷_Merge Sorted Array

    水题,只是思想还是实用的. 当然能够新建出一个数组.比較着拷贝过去.可是没有必要啊亲.想想为什么用源数组会麻烦,由于确定了前面的数.为了后面的数字不被覆盖,要依次往后移,转念一想,先确定后面的数字.就 ...

  2. leetcode第一刷_Set Matrix Zeroes

    这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...

  3. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

  4. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

  5. leetcode第一刷_Insert Interval

    这道题的难度跟微软的那道面试题相当. 要在集合中插入一段新的集合,相当于求两个集合的并了.对于新增加一段集合的情况,分为以下几种: 1. 增加段跟原来的全然相交,也即他的起点和终点都在被包括在原来的段 ...

  6. leetcode第一刷_N-Queens

    八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...

  7. leetcode第一刷_Gray Code

    说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...

  8. leetcode第一刷_Combination Sum Combination Sum II

    啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...

  9. leetcode第一刷_Count and Say

    水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...

随机推荐

  1. 模块热替换 HMR

    devserver:{hot:true},既及时更新代码,样式(需配合loader)变化,自动重编译,只适用于开发环境. 入口文件中,添加监视: + if (module.hot) {+ module ...

  2. spring_02工具及接口案例

    1.spring工具类:ApplicationContextUtil.java,可以返回加载配置文件的容器对象 package com.ahd.utils; import org.springfram ...

  3. react-conponent-secondesElapsed

    <!DOCTYPE html> <html> <head> <script src="../../build/react.js">& ...

  4. iphone手机怎么录屏 两种方法任你挑选

    iphone手机怎么录屏呢?苹果手机拥有独特的Airlay镜像投屏,AirPlay的工作原理是当iPhone或IPAD与支持AirPlay技术的硬件,比如Apple TV等设备处在同一个wife的情况 ...

  5. FUNCTIONALITY OF ITEM CATEGORY

    Item Category Purpose This wiki page will breify discuss about functionality of Item Category in SAP ...

  6. 使用JDBC连接MySQL数据库的一个基本案例

    JDBC的概念(摘自百度百科) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...

  7. cordov vue项目中调用手机原生api

    cordova不仅可以把vue项目打包成app,还可以让vue借助cordova调用手机原生的api 比如拍照 比如图片上传 比如定位 比如扫描二维码 比如支付等等 Vue Cordova教程-Vue ...

  8. Android 与Java 进程退出 killProcess与System.exit

    android所有activity都在主进程中,在清单文件Androidmanifest.xml中可以设置启动不同进程,Service需要指定运行在单独进程?主进程中的主线程?还是主进程中的其他线程? ...

  9. [20190328]简单探究sql语句相关mutexes.txt

    [20190328]简单探究sql语句相关mutexes.txt --//摘要:http://www.askmaclean.com/archives/understanding-oracle-mute ...

  10. jvm程序执行慢诊断手册

    生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长.本文分享,从业多年形成的排查守则. 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步.因为很多事故都是 ...