LeetCode(57):插入区间
Hard!
题目描述:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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]重叠。
解题思路:
这道题让我们在一系列非重叠的区间中插入一个新的区间,可能还需要和原有的区间合并,那么我们需要对给定的区间集一个一个的遍历比较,会有两种情况,重叠或是不重叠,不重叠的情况最好,直接将新区间插入到对应的位置即可,重叠的情况比较复杂,有时候会有多个重叠,我们需要更新新区间的范围以便包含所有重叠区间,之后将新区间加入结果res,最后将后面的区间再加入结果res即可。
具体思路是,用一个变量cur来遍历区间,如果当前cur区间的结束位置小于要插入的区间的起始位置的话,说明没有重叠,则将cur区间加入结果res中,然后cur自增1。直到有cur越界或有重叠,将while循环退出,然后再用一个while循环处理所有重叠的区间,每次取用两个区间起始位置的较小值,和结束位置的较大值来更新要插入的区间,然后cur自增1。直到cur越界或者没有重叠时while循环退出。之后将更新好的新区间加入结果res,再将cur之后的区间再加入结果res中即可。
C++解法一:
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
int n = intervals.size(), cur = ;
while (cur < n && intervals[cur].end < newInterval.start) {
res.push_back(intervals[cur++]);
}
while (cur < n && intervals[cur].start <= newInterval.end) {
newInterval.start = min(newInterval.start, intervals[cur].start);
newInterval.end = max(newInterval.end, intervals[cur].end);
++cur;
}
res.push_back(newInterval);
while (cur < n) {
res.push_back(intervals[cur++]);
}
return res;
}
};
下面这种方法的思路跟上面的解法很像,只不过没有用while循环,而是使用的是for循环,但是思路上没有太大的区别,变量cur还是用来记录新区间应该插入的位置,稍有不同的地方在于在for循环中已经将新区间后面不重叠的区间也加进去了,for循环结束后就只需要插入新区间即可。
C++解法二:
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
int n = intervals.size(), cur = ;
for (int i = ; i < n; ++i) {
if (intervals[i].end < newInterval.start) {
res.push_back(intervals[i]);
++cur;
} else if (intervals[i].start > newInterval.end) {
res.push_back(intervals[i]);
} else {
newInterval.start = min(newInterval.start, intervals[i].start);
newInterval.end = max(newInterval.end, intervals[i].end);
}
}
res.insert(res.begin() + cur, newInterval);
return res;
}
};
下面这种解法就是把上面解法的for循环改为了while循环,其他的都没有变。
C++解法三:
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
int n = intervals.size(), cur = , i = ;
while (i < n) {
if (intervals[i].end < newInterval.start) {
res.push_back(intervals[i]);
++cur;
} else if (intervals[i].start > newInterval.end) {
res.push_back(intervals[i]);
} else {
newInterval.start = min(newInterval.start, intervals[i].start);
newInterval.end = max(newInterval.end, intervals[i].end);
}
++i;
}
res.insert(res.begin() + cur, newInterval);
return res;
}
};
如果学过Design Pattern的,对Iterator Pattern比较熟悉的也可应用Iterator来求解,本质还是一样的,只是写法略有不同。
C++解法四:
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
vector<Interval>::iterator it = intervals.begin();
int cur = ;
while (it != intervals.end()) {
if (it->end < newInterval.start) {
res.push_back(*it);
++cur;
} else if (it->start > newInterval.end) {
res.push_back(*it);
} else {
newInterval.start = min(newInterval.start, it->start);
newInterval.end = max(newInterval.end, it->end);
}
++it;
}
res.insert(res.begin() + cur, newInterval);
return res;
}
};
LeetCode(57):插入区间的更多相关文章
- Java实现 LeetCode 57 插入区间
57. 插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: inte ...
- LeetCode 57 插入区间
题目: 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: intervals ...
- 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小值 ...
随机推荐
- 谨记:new Date()在IOS中的坑
第一次遇到,记录一下 要创建一个指定时间的new Date对象时,通常的做法是: new Date("2018-04-27 11:11");然后就可以根据这个获取年月日等信息 这种 ...
- 5G时代的到来,会给生活带来什么改变?
本文首发于:风云社区. 据百度百科介绍,5G网络是第五代移动通信网络,其峰值理论传输速度可达每秒数十Gb,比4G网络的传输速度快数百倍.举例来说,整部超高画质电影可在1秒之内下载完成. 5G网络已 ...
- H3C常用命令详解
H3C常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.关闭后台日志输出 <yinzhengjie>sys [yinzhengjie]undo info- ...
- JavaEE学习总结(十六)— Servlet
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- Dubbo是什么
读音 |ˈdʌbəʊ| !不是[dubəʊ]! (重点:调用步骤) Dubbo是什么 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.其核心 ...
- 为什么选择图形数据库,为什么选择Neo4j?
最近在抓取一些社交网站的数据,抓下来的数据用MySql存储.问我为什么用MySql,那自然是入门简单,并且我当时只熟悉MySql.可是,随着数据量越来越大,有一个问题始终困扰着我,那就是社交关系的存储 ...
- Ubuntu 16.04及以上 安装/卸载 Docker-CE
前言 本文仅针对Ubuntu 18.10.18.04.16.04的x86_64的OS与架构下的Docker-CE的安装 卸载老板本 如果已安装,请卸载它们: sudo apt-get remove d ...
- Android studio 自动导入(全部)包 import
http://blog.csdn.net/buaaroid/article/details/44979629 1 Android studio 只有import单个包的快捷键:Alt+Enter.没有 ...
- mac系统如何在桌面新建文件(夹)
方法一:(终端方式,推荐) 1.在电脑上找到终端 2.指定你想要保存文件的路径,然后回车.例如桌面就是: cd desktop #或是 cd /Users/username/Desktop 有人问:假 ...
- eclipse2019-03设置代码编辑区背景为图片
一.我的主题设置如下所示 二.找到如下所示或类似的文件夹 三.在该文件夹里的images文件夹里添加图片 四.在CSS目录下的e4-dark_win.css文件中添加如下代码 .MPart Style ...