博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
阅读量:6816 次
发布时间:2019-06-26

本文共 2742 字,大约阅读时间需要 9 分钟。

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

You may assume that the intervals were initially sorted according to their start times.

Example 1:

Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:

Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

思路:

是的一个延伸问题,先看看怎么Merge

Given a collection of intervals, merge all overlapping intervals.

For example,

Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

1 vector
merge(vector
&intervals) { 2 if(intervals.size() <= 1) 3 return intervals; 4 5 vector
vres; 6 sort(intervals.begin(), intervals.end(), intvalcomp);//先对interval排序 7 Interval tmp(intervals[0]); 8 for(Interval it:intervals){ 9 if(tmp.start == it.start){10 tmp.end = it.end;11 }else if(tmp.end >= it.start){
//intervals有序,必然有tmp.start < it->start12 if(tmp.end < it.end)//直接无视后者{[1,4],[2,3]}13 tmp.end = it.end;//直接吞并后者{[1,3],[2,4]}14 }else{15 vres.push_back(tmp);//不相交16 tmp = it;17 }18 }19 vres.push_back(tmp);//漏掉这句会fail{[1,4],[1,4]}20 return vres;21 }22 23 bool intvalcomp(Interval a, Interval b){24 if(a.start == b.start)25 return a.end < b.end;26 else27 return a.start < b.start;28 }

现在有了这个Merge好了的不相交区间序列,怎么进行插入呢?Insert Interval条件太多,每一个大小等号比较,每一个小下标就能让人栽跟斗,因此它也是我目前最讨厌的题目,没有之一。

一开始尝试这种思路:

“新序列按照start排好序(start肯定是各不相同的),第一步我们先用二分找出有交集的序列片段的开始,这一点很像,然后再往后处理。”

脑子不清楚憋了一下午,恶心的我两天不能刷Leetcode,如果真要写出来的话,就老老实实下面这样,效率不一定差,因为看题目反正是不想要你改变输入参数,横竖都得遍历一遍来拷贝。挺有意思的是,晚上我看到了Google Campus的youku视频,讲述的就是一个倒霉孩子花了30min写二分Insert Interval的反例。。。

1 vector
insert(vector
&intervals, Interval newInterval) { 2 vector
rs; 3 int i = 0; 4 while(i < intervals.size() && intervals[i].end < newInterval.start){
//找到第一个起点 5 rs.push_back(intervals[i++]); 6 } 7 if(i == intervals.size()){
//为空或过了结尾点 8 rs.push_back(newInterval); 9 return rs;10 }11 12 newInterval.start = min(newInterval.start, intervals[i].start);13 while(i < intervals.size() && intervals[i].start <= newInterval.end){
//找到结束点 14 newInterval.end = max(newInterval.end, intervals[i++].end);15 }16 rs.push_back(newInterval);17 18 while(i < intervals.size()){19 rs.push_back(intervals[i++]);20 }21 return rs;22 }

 

转载于:https://www.cnblogs.com/wei-li/p/InsertIntervalandMergeIntervals.html

你可能感兴趣的文章
FTP服务器
查看>>
爬百度新闻
查看>>
TCP协议与UDP协议的区别
查看>>
软件定时器算法
查看>>
VB.NET 自动打包程序
查看>>
CISCO引擎RPR SSO
查看>>
LINUX APACHE 安装测试
查看>>
Java导致登录UCS Manager异常
查看>>
HTTP协议
查看>>
Win10怎么改Host文件?Win10编辑host文件方法(无视权限)
查看>>
sql convert and cast
查看>>
我的NodeJS一年之旅总结
查看>>
MyBatis-3.4.2-源码分析6:解析XML之objectWrapperFactoryElement & reflectorFactoryElement
查看>>
javascript与获取鼠标位置有关的属性
查看>>
Oracle database 11.2.0.3.0 升级至 11.2.0.3.14
查看>>
heartbeat理论介绍
查看>>
简单实现MVC模式
查看>>
mysql连接小错误一例
查看>>
奇怪的“考生”:中美高考,我都考一考!
查看>>
winform datagridview 使用论坛。
查看>>