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

转载于:https://www.cnblogs.com/mqxnongmin/p/10749972.html

leetcode第一刷_Merge Intervals相关推荐

  1. LeetCode第一刷--leetcode提交格式介绍与273. Integer to English Words

    第一次玩Leetcode,对代码提交格式不了解,提交了一上午,略尴尬 leetcode确实有很多有意思的地方,不像以前做各个高校ACM练习,leetcode会给出错误信息(哪个数据的错了),也会提供测 ...

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

    非常自然的推广,如果去掉完全二叉树的条件呢?因为这个条件不是关键,因此不会影响总体的思路,做法依然是每次找到一层的起点,然后一层一层的走. 如果是完全二叉树的话,每层的起点就是上一层起点的左孩子,兄弟 ...

  3. leetcode第一刷_Recover Binary Search Tree

    这是一道好题,思路尽管有,可是提交之后总是有数据过不了,又依照数据改改改.最后代码都没法看了.收到的教训是假设必须为自己的代码加上非常多非常多特殊的限定.来过一些特殊的数据的话.说明代码本身有非常大的 ...

  4. leetcode第一刷_Construct Binary Tree from Inorder and Postorder Traversal

    这道题是为数不多的感觉在读本科的时候见过的问题. 人工构造的过程是如何呢.兴许遍历最后一个节点一定是整棵树的根节点.从中序遍历中查找到这个元素,就能够把树分为两颗子树,这个元素左側的递归构造左子树,右 ...

  5. leetcode第一刷_Combinations

    生成组合数是初中的知识,没有人不知道. 组合数学我觉得是最有意思的数学分支,室友应该是这方面的专家,他的纸牌问题我听都听不懂.. 不知道你们是什么感觉.我以看到组合数,立即会想到全排列.这可能是由于当 ...

  6. leetcode第一刷_Search in Rotated Sorted Array

    旋转数组的查找问题.从头開始扫一遍.O(N)的复杂度,一般也能过,甚至先排序下面,再二分都能过.只是这道题的目的当然不在于此. 想一下旋转之后对我们的查找产生了什么影响.假设没旋转过,我们直接比較ta ...

  7. leetcode第一刷_Binary Tree Zigzag Level Order Traversal

    以出现的频率来看.树的层序遍历一定是考察的重点,除非工作人员想找题水数量. zigzag,还是有几道题的,层序的这个非常easy,假设是奇数层.reverse下面就可以.无他.我写的时候预计还不知道这 ...

  8. leetcode第一刷_Word Search

    这道题之前一直没敢做,没想到前天用递归一遍过了. . 当时为什么想着用递归,而不是dp呢.由于我想到达某个位置的情况有非常多,即使从当前位置開始的搜索是已知的,但之前的状态是如何的也无从得知啊,实话实 ...

  9. leetcode第一刷_Count and Say

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

  10. leetcode第一刷_Unique Binary Search Trees

    这道题事实上跟二叉搜索树没有什么关系,给定n个节点,让你求有多少棵二叉树也是全然一样的做法.思想是什么呢,给定一个节点数x.求f(x),f(x)跟什么有关系呢,当然是跟他的左右子树都有关系.所以能够利 ...

最新文章

  1. 腾讯林衍凯:图神经网络,考虑「拓扑信息」会怎样?
  2. C#的循环语句(一)
  3. 微服务架构下 CI/CD 如何落地
  4. Deeplab unexpected label
  5. android光传感实现摩斯密码,根据莫尔斯代码 - Android的闪烁闪光。 如何避免ANR次数由于睡觉? (火炬APP)...
  6. idea设置自动清除不需要的import包,自动清除导包
  7. Linux——Ubuntu安装Fcitx以及Fcitx输入中文不显示候选词框的解决办法
  8. 该伙伴事务管理器已经禁止了它对远程/网络事务的支持
  9. 个人对stacking的思想理解
  10. AndroidStudio安卓原生开发_Activity的启动模式standard和一部分singleTop启动模式---Android原生开发工作笔记86
  11. Foxmail添加微软最新outlook.com邮箱解决方案
  12. 北京网信金服PHP薪资_2020互联网大厂薪资曝光:程序员薪资将会变成白菜价?...
  13. 360两个html页面合并,如何用html2pdf把多个连接的PHP网页合并成一个pdf?
  14. eclipse的java插件,25个最好的免费Eclipse插件
  15. Oracle12c创建可插入式数据库pdb和连接pdb并创建用户心得
  16. 探索未来|一文看懂小米年度技术峰会 · 软件技术专场
  17. 科技爱好者周刊(第 150 期):当音乐还是稀缺的时候
  18. 终于有人把搜索引擎讲明白了
  19. 网站制作的流程包括哪几个步骤?
  20. tomcat启动一直卡在Root WebApplicationContext: initialization completed

热门文章

  1. 计算机设计大赛无人车挑战赛
  2. 位CPU和64位CPU 区别
  3. 网络工程师HCIE-RS-路由回馈问题(通俗易懂!)
  4. H3C VLAN同步MVRP实验
  5. IGMP SSM Mapping原理与实验
  6. java - 常见对象object
  7. 关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
  8. C#之SqlDependency数据库缓存
  9. matlab 自带例子,matlab自带各种分类器的使用示例
  10. docker api java_docker-java Docker的java API