56. Merge Intervals是一个无序的,需要将整体合并;57. Insert Interval是一个本身有序的且已经合并好的,需要将新的插入进这个已经合并好的然后合并成新的。

56. Merge Intervals

思路:先根据start升序排序,然后合并

static作用:https://www.cnblogs.com/songdanzju/p/7422380.html

之间写的一个较为复杂的代码

/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> result;
int length = intervals.size();
if(length <= )
return result;
sort(intervals.begin(),intervals.end(),cmp);
result.push_back(intervals[]);
for(int i = ;i < length;i++){
int st = intervals[i].start;
int en = intervals[i].end;
if(st <= result.back().end){
Interval tmp(result.back().start,en);
if(en >= result.back().end){
result.pop_back();
result.push_back(tmp);
}
else
continue;
}
else
result.push_back(intervals[i]);
}
return result;
}
static bool cmp(Interval a,Interval b){
return a.start < b.start;
}
};

http://www.cnblogs.com/grandyang/p/4370601.html

一个更加简洁的代码:

实际上合并的时候,只用考虑两个问题,一是两个有没有交集,即判断前一个的end是否大于后一个的start,如果没有交集直接加入就好了;二是如果有交集,如何合并,首先每一对本身肯定是start小于end,并且排序是根据start升序排的,所以合并之后的start就是前一个的start,而end则取两者的最大的end就好。

class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if(intervals.empty())
return result;
sort(intervals.begin(),intervals.end(),cmp);
result.push_back(intervals[]);
for(int i = ;i < intervals.size();i++){
if(result.back()[] < intervals[i][])
result.push_back(intervals[i]);
else
result.back()[] = max(result.back()[],intervals[i][]);
}
return result;
}
static bool cmp(vector<int> a,vector<int> b){
return a[] < b[] ? true : false;
}
};

57. Insert Interval

http://www.cnblogs.com/grandyang/p/4367569.html解法一

这个题可以有一个简单的思路,就是把新的interval按大小插入到原来的intervals组成新的intervals,然后使用merge intervals的方法,但这种方法要使用两个result数组,空间使用的更多。

现在这种方法,只用使用一个result数组。

思路:将跟新interval没有交集的先加入result,然后用新interval合并剩下所有跟他有交集的合并成一个更新的interval然后加入result,最后把剩下的没有交集的加入result中。

第一个while是找没有交集

第二个while是找交集,所以这个判断条件注意一下。

合并的操作代码是:

newInterval[] = min(intervals[cur][],newInterval[]);
newInterval[] = max(intervals[cur][],newInterval[]);

第二个max和56. Merge Intervals使用的是一样的,第一个min之所以这样操作,主要是第一个cur的小值可能在intervals,也可能在newInterval中,后面的小值都在newInterval中

class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> result;
if(intervals.empty() && newInterval.empty())
return result;
int cur = ,n = intervals.size();
while(cur < n && intervals[cur][] < newInterval[])
result.push_back(intervals[cur++]);
while(cur < n && newInterval[] >= intervals[cur][]){
newInterval[] = min(intervals[cur][],newInterval[]);
newInterval[] = max(intervals[cur][],newInterval[]);
cur++;
}
result.push_back(newInterval);
while(cur < n)
result.push_back(intervals[cur++]);
return result;
}
};

最新文章

  1. 代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)
  2. 把DATATABLE,DS中的内容用HTML的方式显示
  3. vs2012连接sql2008(错误类型:Could not load file or assembly)
  4. 一个简单的string类,读书看报系列(一)
  5. UNIX基础--进程和守护进程
  6. phpcms的安装以及简单使用
  7. Docker创建 tomcat/weblogic 集群
  8. android打包引用第三方jar出现的错误
  9. Springboot自定义异常处理
  10. 【vue学习】vue 2.0版本以上创建项目的的步骤
  11. 010_vim和python整合开发
  12. 测试cpu的简单工具-dhrystone【转】
  13. Java的基本数据类型大小及其包装类
  14. C++11 并发指南四(&lt;future&gt; 详解一 std::promise 介绍)
  15. MySQL 命令操作数据表
  16. 如何查看xmtb项目接口
  17. so在genymotation中错误问题
  18. php发送get请求
  19. RFID编码
  20. 【Android】16.0 UI开发(七)——列表控件RecyclerView的点击事件实现

热门文章

  1. Ubuntu安装openssh安装ssh、 免密登录、 创建新用户并免密登录
  2. 扇形导航 css3
  3. java 并发编程lock使用详解
  4. java面试题全集(下)
  5. Java函数优雅之道
  6. matlab读取内容为二进制的TXT文件
  7. Linux crontab计划任务
  8. SetConsoleTextAttribute和SetConsoleScreenBufferInfoEx的使用
  9. MySql截取手机号
  10. Maven:mirror和repository