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;
}
};leetcode第一刷_Merge Intervals的更多相关文章
- leetcode第一刷_Merge Sorted Array
水题,只是思想还是实用的. 当然能够新建出一个数组.比較着拷贝过去.可是没有必要啊亲.想想为什么用源数组会麻烦,由于确定了前面的数.为了后面的数字不被覆盖,要依次往后移,转念一想,先确定后面的数字.就 ...
- leetcode第一刷_Set Matrix Zeroes
这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...
- leetcode第一刷_Permutations II
当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...
- leetcode第一刷_Populating Next Right Pointers in Each Node II
很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...
- leetcode第一刷_Insert Interval
这道题的难度跟微软的那道面试题相当. 要在集合中插入一段新的集合,相当于求两个集合的并了.对于新增加一段集合的情况,分为以下几种: 1. 增加段跟原来的全然相交,也即他的起点和终点都在被包括在原来的段 ...
- leetcode第一刷_N-Queens
八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...
- leetcode第一刷_Gray Code
说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...
- leetcode第一刷_Combination Sum Combination Sum II
啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...
- leetcode第一刷_Count and Say
水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...
随机推荐
- IE console.log 调试状态
最近项目遇到问题,发现alert一个弹窗,在IE中,打开开发人员工具后,可以弹出,但是不打开无法弹出,最后发现是console.log的原因,注释掉console相关的代码,问题就解决了 有些版本的I ...
- Git中的"pull request"真正比较的是什么?
前言 利用git版本控制工具时,我们通常会从主分支拉出新分支进行开发,开发完成后创建pr(也就是pull request),让其他小伙伴帮忙review,确定代码没有问题后再将新分支合并到主分支上.但 ...
- python进程基础
目录 进程以及状态 1. 进程 2. 进程的状态 进程的创建-multiprocessing 1. 创建进程 2. 进程pid 3. Process语法结构如下 4. 给子进程指定的函数传递参数 5. ...
- springboot最新版本自定义日志注解和AOP
LogAspectAnnotation @ControllerLogAspectAnnotation /** * * Define a log facet annotation * @author s ...
- 面试官:"谈谈分库分表吧?"
原文链接:面试官:"谈谈分库分表吧?" 面试官:“有并发的经验没?” 应聘者:“有一点.” 面试官:“那你们为了处理并发,做了哪些优化?” 应聘者:“前后端分离啊,限流啊 ...
- 将Y-m-d转换为Y年m月d日
自己编写的,不能直接套用,理解后可自行变化: $var=explode(' ',$res['act_starting']); $var1=$var[0]; $time=explode ...
- C# SqlBulkCopy类批量导入 测试
一.功能说明 1.可以选择,只导入部分列,或者导入全部列. 2.导入速度的确比一般sql要快. 3.不用写sql语句 ----------------------------------------- ...
- SqL读取XML、解析XML、SqL将XML转换DataTable、SqL将XML转换表
DECLARE @ItemMessage XML )) SET @ItemMessage=N' <ReceivablesInfos> <ReceivablesList> < ...
- element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Link Between SAP SD, MM & FI
Link Between SAP SD, MM & FI 1. In SAP you will always get integration with other modules. SD wi ...