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;
}
};

leetcode 56. Merge Intervals 、57. Insert Interval的更多相关文章

  1. [LeetCode] 56. Merge Intervals(vector sort)

    /** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0 ...

  2. LeetCode 56. Merge Intervals (合并区间)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  3. 合并区间 · Merge Intervals & 插入区间 · Insert Interval

    [抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...

  4. LeetCode: 56. Merge Intervals(Medium)

    1. 原题链接 https://leetcode.com/problems/merge-intervals/description/ 2. 题目要求 给定一个Interval对象集合,然后对重叠的区域 ...

  5. Leetcode#56 Merge Intervals

    原题地址 排序+合并,没啥好说的 第一次尝试C++的lambda表达式,有种写js的感觉,很神奇 c11就支持了lambda表达式,仔细想想,我学C++大概就是在09~10年,c11还没有发布,不得不 ...

  6. [LeetCode] 56. Merge Intervals 解题思路

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  7. [LeetCode] 56 - Merge Intervals 合并区间

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  8. [leetcode]56. Merge Intervals归并区间

    Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...

  9. LeetCode 56. Merge Intervals 合并区间 (C++/Java)

    题目: Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6] ...

随机推荐

  1. java.lang.IllegalArgumentException: id to load is required for loading

    java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.LoadEv ...

  2. ThinkPHP中header()无法发生跳转的解决办法

    一定要在header('Location:url')后加上exit()/die()才可以,特此记录.

  3. 关于strcpy的安全函数的选择

    1)如果整个程序,在进行字符拷贝时,这个拷贝字符串的完整性,不影响整个程 序的运行,可以让其截取一部分字符串,程序继续执行.那么我们就可以选择安全 函数:strncpy_s 2)如果在进行字符串拷贝时 ...

  4. jsp-TagLib标签库

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...

  5. hadoop的权限控制

    HDFS支持权限控制,但支持较弱.HDFS的设计是基于POSIX模型的,支持按用户.用户组.其他用户的读写执行控制权限.在linux命令行下,可以使用下面的命令修改文件的权限.文件所有者,文件所属组: ...

  6. zabbix 内存溢出

    tail -f /var/log/zabbix/zabbix_server_log ::165110.914 ================================ ::165110.914 ...

  7. 005-监控项item详解,手动创建item实例

    模板里的监控项都可以用 zabbix-get 命令执行 来获取相应的值,方法如下: [root@linux-node2 ~]# zabbix_get -s 192.168.1.230 -k agent ...

  8. Linux日常之数据重定向

    Linux在启动后,会默认打开3个文件操作符,分别是 (1)标准输入0,standard input (2)正确输出1,standard output (3)错误输出2,standard error ...

  9. MySQL Select查询

    1. 基本语法: SELECT {* | <字段列名>} [ FROM <表 1>, <表 2>… [WHERE <表达式> [GROUP BY < ...

  10. GitHub上传项目时——解决failed to push some refs to git

    原文地址:https://jingyan.baidu.com/article/f3e34a12a25bc8f5ea65354a.html 遇到的问题: error: failed to push so ...