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]
.
解题思路一:
参考Java for LeetCode 056 Merge Intervals思路一,去掉最外层循环即可,JAVA实现如下:
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if (newInterval == null)
return intervals;
int startIndex = 0, endIndex = 0;
for (int j = 0; j < intervals.size(); j++) {
if (newInterval.start > intervals.get(j).end) {
startIndex += 2;
endIndex += 2;
continue;
}
if (newInterval.end < intervals.get(j).start)
break;
if (newInterval.start >= intervals.get(j).start)
startIndex++;
if (newInterval.end > intervals.get(j).end) {
endIndex += 2;
continue;
}
if (newInterval.end >= intervals.get(j).start)
endIndex++;
break;
}
if(startIndex==endIndex&&startIndex%2==0)
intervals.add(startIndex/2,new Interval(newInterval.start,newInterval.end));
else if(startIndex%2==0&&endIndex%2==0){
intervals.get(startIndex/2).start=newInterval.start;
intervals.get(startIndex/2).end=newInterval.end;
for(int k=1;k<endIndex/2-startIndex/2;k++)
intervals.remove(startIndex/2+1);
}
else if(startIndex%2==0&&endIndex%2!=0){
intervals.get(startIndex/2).start=newInterval.start;
intervals.get(startIndex/2).end=intervals.get(endIndex/2).end;
for(int k=1;k<=endIndex/2-startIndex/2;k++)
intervals.remove(startIndex/2+1);
}
else if(startIndex%2!=0&&endIndex%2==0){
intervals.get(startIndex/2).end=newInterval.end;
for(int k=1;k<endIndex/2-startIndex/2;k++)
intervals.remove(startIndex/2+1);
}
else if(startIndex%2!=0&&endIndex%2!=0){
intervals.get(startIndex/2).end=intervals.get(endIndex/2).end;
for(int k=1;k<=endIndex/2-startIndex/2;k++)
intervals.remove(startIndex/2+1);
}
return intervals;
}
解题思路二:
参考Java for LeetCode 056 Merge Intervals思路二,添加后重新排序即可,JAVA实现如下:
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if (intervals == null)
return intervals;
List<Interval> list = new ArrayList<Interval>();
intervals.add(newInterval);
Comparator<Interval> comparator = new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.start == o2.start)
return o1.end - o2.end;
return o1.start - o2.start;
}
};
Collections.sort(intervals, comparator);
for (Interval interval : intervals) {
if (list.size() == 0 || list.get(list.size() - 1).end < interval.start)
list.add(new Interval(interval.start, interval.end));
else
list.get(list.size() - 1).end = Math.max(interval.end, list.get(list.size() - 1).end);
}
return list;
}