题目:Insert Interval
难度:hard
问题描述:
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]
.
解题思路:
这题与leetCode练习 (56)基本一致,我在56题的时候就把此题作为分问题给解出来啦~ 主要思路参见56题,只做了接口的修改~
具体代码如下:
public class Interval{
int start;
int end;
Interval(){
start=0;
end=0;
}
Interval(int s,int e){
start=s;
end=e;
}
}
public List<Interval> insert(List<Interval> list,Interval interval){
Iterator<Interval> itor;
Interval temp,temp1;
if(list.size()==0){ //链表为空
list.add(interval);
return list;
}
if(interval.end<list.get(0).start){
list.add(0, interval);
return list;
}
itor=list.iterator();
int i=-1;
while(itor.hasNext()){
i++;//记录当前temp的位置
temp=itor.next();
if(interval.start>temp.end){//与该区间无交集且大于该区间
if(i==list.size()-1){
list.add(interval);
return list;
}else{
continue;
}
}else if(interval.end<temp.start){ //无交集 小于该区间
list.add(i, interval);
return list;
}else{//与该区间有交集
if(interval.start>=temp.start&&interval.end<=temp.end){
//包含于temp 直接被吸收
return list;
}else{
temp.start=Math.min(temp.start, interval.start);
temp.end=Math.max(temp.end, interval.end);
while(true){
if(i+1<list.size()){
temp1=itor.next();
if(temp1.start<=temp.end){
temp.end=Math.max(temp.end, temp1.end);
itor.remove();
}else{
return list;
}
}else{
return list;
}
}
}
}
}
//list.add(interval);
return list;
}