这个题看起来可以使用“合并区间”的解法,但题目已经告知了输入的数组是已经按start字段升序,那么我们仅需要找到插入点,然后向后合并即可。时间复杂度O(n),空间复杂度O(n)(采用了list)。
public class Solution {
public Interval[] insertInterval (Interval[] Intervals, Interval newInterval) {
List<Interval> list = new LinkedList<>();
boolean flag = false;//判断目标区间是否已经成功加入
for(int i=0;i<Intervals.length;++i){
list.add(Intervals[i]);
}
for(int i=0;i<list.size();++i){
if(list.get(i).start>newInterval.start){
list.add(i,newInterval);
flag = true;
break;
}
}
if(!flag)list.add(newInterval);//如果目标区间还没加入,直接放到最后
List<Interval> reslist = new LinkedList<>();
reslist.add(list.get(0));
for(int i=1;i<list.size();++i){
if(list.get(i).start>reslist.get(reslist.size()-1).end){
reslist.add(list.get(i));
}
else {
reslist.get(reslist.size()-1).end = Math.max(list.get(i).end,reslist.get(reslist.size()-1).end);
}
}
Interval[] res = new Interval[reslist.size()];
int index = 0;
for(Interval i:reslist){
res[index++] = i;
}
return res;
}
}