给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。
注意以下测试用例:
1、[[1,3], [5,6], [9,12]] [2,11]
2、[[1,5]] [0,2]
3、[[1,5]] [0,6]
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
*/
class Solution {
/**
* Insert newInterval into intervals.
* @param intervals: Sorted interval list.
* @param newInterval: A new interval.
* @return: A new sorted interval list.
*/
public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
if(null == intervals || intervals.size() == 0) {
intervals.add(newInterval);
return intervals;
}
int indexStart = binarySearchStart(intervals, newInterval);
int indexEnd = binarySearchEnd(intervals, newInterval);
if(indexStart != indexEnd) {
for(int i = indexEnd; i > indexStart; i--) {
intervals.remove(i);
}
indexEnd = indexStart;
}
if(indexEnd + 1 < intervals.size() && intervals.get(indexEnd + 1).start <= newInterval.end) {
newInterval.end = Math.max(intervals.get(indexEnd + 1).end, newInterval.end);
intervals.remove(indexEnd + 1);
}
if(indexStart >= 0 && intervals.get(indexStart).end >= newInterval.start) {
newInterval.start = intervals.get(indexStart).start;
newInterval.end = Math.max(intervals.get(indexStart).end, newInterval.end);
intervals.remove(indexStart);
indexStart--;
}
intervals.add(indexStart + 1, newInterval);
return intervals;
}
public int binarySearchStart(ArrayList<Interval> intervals, Interval newInterval) {
int low = 0;
int high = intervals.size() - 1;
while(low <= high) {
int mid = low + (high - low)/2;
if(intervals.get(mid).start == newInterval.start) {
return mid;
} else if(intervals.get(mid).start < newInterval.start) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return high;
}
public int binarySearchEnd(ArrayList<Interval> intervals, Interval newInterval) {
int low = 0;
int high = intervals.size() - 1;
while(low <= high) {
int mid = low + (high - low)/2;
if(intervals.get(mid).end == newInterval.end) {
return mid;
} else if(intervals.get(mid).end < newInterval.end) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return high;
}
}