题目:

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

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

示例 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. 论文笔记:AdaScale: Towards real-time video object detection using adaptive scalingAdaScale

    AdaScale: Towards real-time video object detection using adaptive scaling 2019-02-18 16:14:17 Paper: ...

  2. HttpClient exception:ExceptionType:System.Threading.Tasks.TaskCanceledException: The operation was canceled. ---> System.IO.IOException: Unable to read data from the transport connection: Operation ca

    error msg: System.Threading.Tasks.TaskCanceledException: The operation was canceled. ---> System. ...

  3. Maven构建 SpringMVC+Spring+MyBatis 环境整合

    目录 1. Maven 项目搭建 2. Maven 插件生成 MyBatis 代码 3. 待续 ... 开发环境 开发环境请尽量保持一致,不一致的情况可能存在问题. JDK 1.7 MyEclipse ...

  4. 支付宝支付之App支付

    与微信支付对比,支付宝支付就没有那么多坑了,毕竟支付宝开放平台的文档还是描述的很详细的. 支付宝开放平台地址:https://docs.open.alipay.com/204/105297/ 支付宝支 ...

  5. jsp 遍历集合——关于获取集合的长度

    一,关于获取集合长度问题 在jsp页面中不能通过${list.size}取列表长度,而是 EL表达式不能获取集合的长度 如:${list.size} <%@ taglib uri="h ...

  6. Pycharm快捷键设置(鼠标滚动控制字体大小)

    一.pycharm字体放大的设置 File —> setting —> Keymap —>在搜寻框中输入:increase —> Increase Font Size(双击) ...

  7. Git 安装和使用Tips

    1. git的安装 2. git的常见用法 3. git的常见问题 1. git的安装 1)首先去下载https://git-scm.com/downloads 在上述官网上下载符合自己操作系统的gi ...

  8. 环境搭建之allure的安装配置,及简单使用

    环境准备 首先是要安装好jdk的电脑上,运行java.javac这些命令都没有问题,要不安装allure时会报错 下载allure 如果直接用Jenkins上的插件,并不需要下载安装 allure官网 ...

  9. NetSec2019 20165327 EXP5 MSF基础应用

    NetSec2019 20165327 EXP5 MSF基础应用 实践目标 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如 ...

  10. 使用EasyPOI导出excel示例

    package com.mtoliv.sps.controller; import java.io.IOException; import java.io.OutputStream; import j ...