LeetCode 57 插入区间
题目:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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 插入区间的更多相关文章
- Java实现 LeetCode 57 插入区间
57. 插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: inte ...
- leetcode刷题-57插入区间
题目 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入:intervals = ...
- leetcode Insert Interval 区间插入
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...
- 【BZOJ】3065: 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...
- lintcode:插入区间
题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...
- bzoj 3065: 带插入区间K小值 替罪羊树 && AC300
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1062 Solved: 253[Submit][Status] Des ...
- [LeetCode] 57. Insert Interval 解决思路
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- 合并区间 · Merge Intervals & 插入区间 · Insert Interval
[抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...
- [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树
刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...
随机推荐
- vue-router的简单理解
Vue-router原理了解一下: 找到一篇文章,分析的很透彻 从vue-router看前端路由的两种实现,文章写的很好,看完这篇文章 ➕ 看源码应该可以理解,这里根据我浅显的理解概括一下: vue- ...
- 【GO】【环境配置】
1.首先下载GO的安装包:https://golang.org/doc/install#testing 找到上面一个Download超大按钮,找不到的可以不用再看了. 下载完成,安装. 安装成功后,启 ...
- Laravel Not Found Exceptions 取数据的一个小技巧
从 model 中取数据的时候, 用下面的方法, 而不是简单的 find(1), 或 first(), 这样如果刚好要查询的数据没有, 就会返回比较友好的 404 页面: $model = App\F ...
- mysql分库 分页查询
Mysql海量数据分表分库如何列表分页? 1.现在使用ElasticSearch了.基于Lucene的解决方案 2.必须将mysql里的数据写入到类似hbase这样的分布式数据库,查询快.但分页.查询 ...
- Qt5OpenGL.顶点像素大小设置
1. 2. // ZC: 像素点的大小 设置:2种方式: // ZC: (1)代码指定方式 // ZC: (2)GLSL种指定方式[A]只能在顶点着色器种指定,不能在片原着色器种指定[B]代码中还要指 ...
- [Linux]安装node.js
node.js安装 安装node.js的版本控制工具nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/ins ...
- HBase Block Cache(块缓存)
Block Cache HBase提供了两种不同的BlockCache实现,用于缓存从HDFS读出的数据.这两种分别为: 默认的,存在于堆内存的(on-heap)LruBlockCache 存在堆外内 ...
- ionic 在windows环境下更换logo和加载图片的问题
做用自己的电脑做ionic项目时,更换logo和加载图片时,无论使用哪种命令,发现都上传不了,并且报错 最后发现,需要将 icon和splash两个文件改为.ai格式才能上传成功. 这是最终生成后的文 ...
- 上海高校程序设计联赛 D-CSL的字符串 栈模拟
题目链接:https://ac.nowcoder.com/acm/contest/551/D ASCII码表示的字符转换成整数实测不超过200(具体多少懒得查了) 分析:要求总的字典序最小,那就让最小 ...
- highchart 十字准星 crosshairs
crosshairs: true, crosshairs: [true, true], // 同时启用竖直及水平准星线 crosshairs: [{ // 设置准星线样式 width: 2, colo ...