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]
.
这道题我一开始想的太复杂了,分别考虑了要插入的interval的start落在interval之前,之间和之后的情况。对于其中的每一种情况都要分别考虑end落在不同位置的情况下该怎么处理,所以写出来的代码相当的繁琐而且很容易写错,提交了六七次才过。
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if(intervals.size() == 0){
intervals.add(newInterval);
return intervals;
}
for(int i = 0 ; i < intervals.size() ; i ++ ){
if(((i== 0)||(i > 0 && newInterval.start > intervals.get(i-1).end)) && newInterval.start < intervals.get(i).start ){
for(int j = i ; j < intervals.size() ;){
if(newInterval.end < intervals.get(j).start){
intervals.add(j,newInterval);
return intervals;
}
else{
Interval tmp = intervals.remove(j);
if(newInterval.end <= tmp.end){
newInterval.end = tmp.end;
intervals.add(j,newInterval);
return intervals;
}
else if(j == intervals.size()){
intervals.add(newInterval);
return intervals;
}
}
}
}
else if(newInterval.start >= intervals.get(i).start && newInterval.start <= intervals.get(i).end){
newInterval.start = intervals.get(i).start;
for(int j = i ; j < intervals.size() ; ){
if(newInterval.end < intervals.get(j).start){
intervals.add(j,newInterval);
return intervals;
}
else{
Interval tmp = intervals.remove(j);
if( tmp.end >= newInterval.end ){
newInterval.end = tmp.end;
intervals.add(j,newInterval);
return intervals;
}
else if(j == intervals.size()){
intervals.add(newInterval);
return intervals;
}
}
}
}
else if(i == intervals.size() -1){
intervals.add(newInterval);
return intervals;
}
}
return intervals;
}
后来参考了下别人的思路,发现自己确实想的太复杂了。其实整个只需要分成三种情况:
1,newInterval在比较的interval之前,将newInterval添加到interval之前,返回list结束;
2,newInterval与比较的interval有相交的部分,newInterval的start取newInterval和interval中较小的那个,newInterval的end取newInterval和interval中较大的那个,将interval从list中删除,继续循环,与list中的其他interval比较;
3,newInterval在比较的interval之后,继续循环,与list中的其他interval比较;
后两种情况如果循环结束时还没通过1返回list结束,则将newInterval添加到list最后,返回list结束。
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if(intervals.size() == 0){
intervals.add(newInterval);
return intervals;
}
ListIterator<Interval> it = intervals.listIterator();
while(it.hasNext()){
Interval tmp = it.next();
if(tmp.start > newInterval.end){
it.previous();
it.add(newInterval);
return intervals;
}
else if(tmp.end < newInterval.start)
continue;
else {
newInterval.start = Math.min(newInterval.start, tmp.start);
newInterval.end = Math.max(newInterval.end, tmp.end);
it.remove();
}
}
it.add(newInterval);
return intervals;
}