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]
.
这道题和上一题蛮像的。刚开始的思路依照上一题,我先把要插入的区间放到数组中合适的位置中去,然后就按照上题,一次遍历即可。代码如下:
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> list = new ArrayList<Interval>();
int cnt = 0;
for(Interval inter : intervals){
if(inter.start < newInterval.start){
cnt ++;
continue;
}else{
break;
}
}
intervals.add(cnt, newInterval);
int left = intervals.get(0).start;
int right = intervals.get(0).end;
for(Interval inter : intervals){
if(right < inter.start){
list.add(new Interval(left,right));
left = inter.start;
right = inter.end;
}else{
right = Math.max(right, inter.end);
}
}
list.add(new Interval(left,right));
return list;
}
}
不过这样是比较慢的,因为插入的时候需要移动后面的元素。可以新建一个链表ret,直接从前向后遍历一次,主要以下三种情况:
1、newInterval与当前interval没有交集,则按照先后次序加入newInterval和当前interval,然后装入所有后续interval。返回ret。
2、newInterval与当前interval有交集,合并成为新的newInterval,然后处理后续interval。
3、处理完最后一个interval若仍未返回ret,说明newInterval为最后一个interval,装入ret。返回ret。
这样写完速度果然有所加快,代码如下:
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> list = new ArrayList<Interval>();
boolean flag = false;
for(Interval inter : intervals){
if(flag == false){
if(inter.end < newInterval.start){
list.add(inter);
continue;
}else if(inter.start > newInterval.end){
list.add(newInterval);
list.add(inter);
flag = true;
continue;
}else{
newInterval = new Interval(Math.min(inter.start, newInterval.start),Math.max(inter.end, newInterval.end));
}
}else{
list.add(inter);
}
}
if(flag == false){
list.add(newInterval);
}
return list;
}