题目链接::力扣
解题思路,因为只插入一个新的区间,所以只需要找到插入的新区见的位置即可,如果与来的区间重叠,则进行合并, 两个区间重叠需要判断的情况比较多,可以判断两个区间不重叠的情况,剩余的则是重叠的情况。具体算法如下:
- begin=newInterval[0],end=newInterval[0],记录要插入区间的左右端点,count记录插入后新区间的数量,i = 0,记录已经处理的intervals中的区间数量
- 从前往后遍历intervals:
- 如果end<intervals[i][0]:说明插入区间在当前区间的左侧,没有重叠,不需要合并,找到了新区见的插入位置,break退出循环
- 否则,如果begin>intervals[i][1]:说明插入区间在当前区间的右侧,需要将当前区间加入的结果中,result[count++] = intervals[i]
- 否则:说明插入区间与当前区间有重叠,需要合并区间,更新begin和end
- begin=Math.min(begin,intervals[i][0])
- end = Math.max(begin,intervals[i][1])
- 从上述循环退出,则找到了插入区间的位置,并且已经进行了区间的合并,将合并后的区间加入到result中,result[count++]=new int[]{begin,end}
- 将intervals数组中剩余的区间加入到result中
AC代码
class Solution {
public static int[][] insert(int[][] intervals, int[] newInterval) {
int count = 0;
//最多有intervals.length+newInterval.length个区间
int[][] result = new int[intervals.length+newInterval.length][2];
int begin = newInterval[0];
int end = newInterval[1];
int i = 0;
for (i = 0; i < intervals.length; i++) {
if (end<intervals[i][0]){//插入区间在当前区间的左侧
break;
} else if (begin>intervals[i][1]){//插入区间在当前区间的右侧
result[count++]=intervals[i];
}else {//有交集,计算合并后的新区间
begin = Math.min(begin,intervals[i][0]);
end = Math.max(end,intervals[i][1]);
}
}
result[count++]=new int[]{begin,end};
for (;i<intervals.length;i++){
result[count++]=intervals[i];
}
return Arrays.copyOf(result,count);
}
}