这道题是在一个区间的集合中插入一个区间后输出新生成的区间。我对这道题就是直观的解题思路:二分查找找到要插入的区间的前后端点在整个区间集合中的位置,然后删掉中间的区间,并在比较插入区间的端点值与之前的区间端点的大小之后插入新的区间。
因为存在要插入的端点在已有的区间内部和在已有区间外两种情况,所以我在二分查找的时候多记录了一个这个,在数组的第二个元素中表示。根据这个,在二分查找时,如果在区间内部,就记录已有区间的位置,如果在区间外,就对新的区间的前端点记录其在原区间集合中相邻的右边的区间的位置,而对新的区间的后端点记录其在原区间集合中相邻的左边的区间的位置。这样,就可以确定要删掉的区间的首尾位置了。然后比较新旧端点大小添加新的区间即可。
有一些边界条件需要注意:比如输入为空或者新区间的前后端点都小于或大于原区间集合的所有端点值时,计算插入的值直接就取输入的值就行了。不然就会和数组界外的区间去比较了。
代码如下:
class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
int len=intervals.size();
if (len==0)
{
intervals.add(newInterval);
return intervals;
}
int start=newInterval.start, end=newInterval.end;
int [] indexst=Binarysearch(intervals,start,0,len-1);
int [] indexend=Binarysearch(intervals,end,0,len-1);
int min,max;
if (indexst[0]==indexend[0] && indexst[1]==1) return intervals;
if (indexend[1]==0) indexend[0]-=1;
if (indexst[0]==len) min=start;
else min=Math.min(start,intervals.get(indexst[0]).start);
if (indexend[0]==-1) max=end;
else max=Math.max(end,intervals.get(indexend[0]).end);
for (int i=indexst[0]; i<=indexend[0];i++)
{
intervals.remove(indexst[0]);
}
Interval inter=new Interval(min,max);
intervals.add(indexst[0],inter);
return intervals;
}
public int[] Binarysearch (List<Interval> intervals, int search, int from, int to)
{
int []result=new int[2];
while(true)
{
int m=(from+to)/2;
Interval now=intervals.get(m);
if (now.start<=search && now.end>=search)
{
result[0]=m;
result[1]=1;
return result;
}
else if (now.end<search)
{
from=m+1;
if (from>to)
{
result[0]=from;
result[1]=0;
return result;
}
}
else
{
to=m-1;
if (from>to)
{
result[0]=from;
result[1]=0;
return result;
}
}
}
}
}