题目:

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]

示例 2:

输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8][3,5],[6,7],[8,10] 重叠。

解题思路:

对于这个示例  [ [1,3], [6,9] ]  ,插入的区间可分为以下几种:

1、插入区间的end小于示例第一个区间的start,如:[-1,0] ,此时应该把这个newInterval插入,然后把剩余的示例区间依次插入即可

2、插入区间在给定的两个区间的间隔处,如 [4,5]

3、插入区间有重叠,如 [2,7]

4、插入区间在给定区间的最后一个位置插入,如 [10,11]

针对1、2、3中情况容易处理,主要是第3种情况。为解决第3种情况,我们想到用双指针来记录重叠的起始位置。如设置left和right,left为开始重叠的start较小者,right为最后一个重叠的end较大者。在第3种情况中(还是以 [2,7] 为例),开始重叠时为 [1,3] , 比较1和2,则取left为1;最后一个重叠时为 [6,9] , 比较9和7, 则取right = 9 。

代码:

 /**
* 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> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> ans;
if(intervals.empty()) {
ans.push_back(newInterval);
return ans;
}
Interval temp;
int left,right;
int lflag = ;
int insertOk = ;
int len = intervals.size();
for(int i = ; i < len; ++i) {
if(i == && newInterval.end < intervals[i].start){ //如果newInterval在intervals的第一个之前
insertOk = ;
ans.push_back(newInterval);
}
if(insertOk) { //已经插入,把intervals的后序逐个插入
ans.push_back(intervals[i]);
continue;
}
if(newInterval.start > intervals[i].end){
ans.push_back(intervals[i]);
if(i == len - || newInterval.end < intervals[i+].start) { //判断是否是最后一个或者下一个不重叠
ans.push_back(newInterval);
insertOk = ;
}
}
else {
if(newInterval.start >= intervals[i].start && newInterval.end <= intervals[i].end) { //当前intervals包含了newInterval
ans.push_back(intervals[i]);
insertOk = ;
}
else {
if(!lflag) { //没有包含,则记录左边界
lflag = ;
left = min(newInterval.start, intervals[i].start);
}
if(newInterval.end <= intervals[i].end ) {
right = intervals[i].end; //注意这里是和下面right取值不同之处
temp.start = left;
temp.end = right;
ans.push_back(temp);
insertOk = ;
}
else {
if(i == len - || newInterval.end < intervals[i+].start) {
right = newInterval.end;
temp.start = left;
temp.end = right;
ans.push_back(temp);
insertOk = ;
} }
}
}
}
return ans;
}
};

LeetCode 57 插入区间的更多相关文章

  1. Java实现 LeetCode 57 插入区间

    57. 插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: inte ...

  2. leetcode刷题-57插入区间

    题目 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入:intervals = ...

  3. leetcode Insert Interval 区间插入

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...

  4. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  5. lintcode:插入区间

    题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...

  6. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

  7. [LeetCode] 57. Insert Interval 解决思路

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

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

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

  9. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

随机推荐

  1. js注意点:数组比较大小方法及数组与对象的区别

    (迁移自旧博客2017-04-19) 快速复制数组及数组比较大小方法 首先介绍一下复制数组的方法: var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; var ...

  2. ASP.NET Core API 接收参数去掉烦人的 [FromBody]

    在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody ...

  3. loj #6.Guess Number

    原题链接:https://loj.ac/problem/6 Guess Number 内存限制:256 MiB 时间限制:1000 ms 题目类型:交互 题目描述 这是一个交互题的模板. 系统会随机生 ...

  4. oracle数据库查看和解除死锁

    查看死锁: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_ ...

  5. vim中文乱码问题

    问题如下: 修改 /etc/vimrc 文件 添加: ,ucs-bom,gb18030,gbk,gb2312,cp936 把/etc/vimrc复制到你自己的根目录下面:复制为.vimrc(前面有个点 ...

  6. node中间层实现文件上传

    一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在n ...

  7. spring boot2.0(一 ) 基础环境搭建

    1.基础配置 开发环境:window jdk版本:1.8(spring boot2.0最低要求1.8) 开发工具:eclipse 构建方式:maven3 2.POM配置文件 <project x ...

  8. web api 安全

    这方面的文章已经有很多了,我只是记录一下自己在项目中应用的具体实现 客户端 DateTime t = DateTime.Now; long timeStamp = SignHelper.Convert ...

  9. 在命令行启动vscode

    1.windows使用 code . 命令打开vscode 1.打开vscode安装位置,进入bin文件夹,复制路径 eg:E:\Microsoft VS Code\bin:2.回到桌面,右键我的电脑 ...

  10. Vue2全家桶之二:vue-router(路由)详细教程,看这个就够了

     作者:东西里本文转载于:https://www.jianshu.com/p/514c7588e877来源:简书 转载仅供自己日后看方便.  由于Vue在开发时对路由支持的不足,于是官方补充了vue- ...