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 Intervals中的归并的思想。 对于Merge Intervals,给定任意的区间进行归并,先将所有区间进行排序然后进行归并。 但Insert Interval这个是给定的区间本来就是有序的,且没有重叠的部分,然后插入一个区间,然后将插入的区间与它有重合的区间进行归并。 其实可以跟Merge Intervals一样进行归并,先在原来的区间序列中找到要插入的区间newInterval所在的位置,然后将newInterval与剩下的区间进行归并就可以了。
但是要注意的是,当newInterval要插入的位置是原区间序列的最后时,要分开讨论。
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> res=new ArrayList<Interval>();
if(intervals.size()<=0) {
res.add(newInterval);
return res;
}
if(newInterval==null) return intervals;
Interval last=null;
for(int i=0;i<intervals.size();i++)
{
Interval temp=intervals.get(i);
if(temp.end<newInterval.start)
{
res.add(temp);
continue;
}else {
//找到newInterval要插入的位置,并与当前位置的区间进行归并,有两种情况
//当newInterval与当前位置区间的前面,且没有交集时
if(newInterval.end < temp.start)
{
res.add(newInterval);
last=temp;
}else {
//当newInterval与当前位置的区间有交集时
int start = temp.start <= newInterval.start ? temp.start : newInterval.start;
int end=temp.end <= newInterval.end ? newInterval.end : temp.end;
last=new Interval(start,end);
}
//与剩下的区间进行归并
for(int j=i+1;j<intervals.size();j++)
{
Interval t =intervals.get(j);
if(t.start>last.end )
{
res.add(new Interval(last.start,last.end));
last=t;
}else {
last.end= last.end > t.end ? last.end : t.end;
}
}
res.add(last);
break;
}
}
//当要插入的区间在原序列中最后一个区间的后面时,将newInterval加入结果集
if(newInterval.start>res.get(res.size()-1).end)
res.add(newInterval);
return res;
}
}