1. 模拟
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> resList = new ArrayList<>();
int left = newInterval[0];
int right = newInterval[1];
boolean placed = false;
for(int[] interval : intervals){
if(interval[0] > right){
if(!placed){
resList.add(new int[]{left, right});
placed = true;
}
resList.add(interval);
}else if(interval[1] < left){
resList.add(interval);
}else{
left = Math.min(interval[0], left);
right = Math.max(interval[1], right);
}
}
if(!placed){
resList.add(new int[]{left, right});
}
int[][] res = new int[resList.size()][];
for(int i = 0; i < resList.size(); i++){
res[i] = resList.get(i);
}
return res;
}
}
直观的想法是遍历 intervals 数组, 考虑 newInterval 对每一个子数组所产生的影响,其中没有交集的两种情况很好考虑,无非是直接加入结果数组中。
关键是有交集的情况自己没有想明白,以为又要考虑偏左相交、完全包含、偏右相交等情况分别处理。对于相交的区间,只需要比较两个边界来合并成新的区间即可,将所有相交区间合并后加入到结果 List 中。
对于二维数组的处理,可考虑创建 List<int[]> 来更方便的实现修改,最后转化为二维数组。另外,除了官方题解给出的遍历方案实现转化,还可以使用 toArray() 函数,具体如下:
return resList.toArray(new int[0][]);
placed 变量的作用是确定添加合并区间的时机。若找到了某个区间完全处于 newInterval 的右侧,说明合并区间已达到最大情况,此时将 [left, right] 加入 resList, 否则在 intervals 遍历完全后添加。
本文解析了一段Java代码,演示如何在二维数组(区间列表)中插入一个新区间,并合并相交区间。通过遍历和边界比较,实现合并操作,最后返回合并后的区间列表。重点在于理解区间处理逻辑和placed变量的作用。
963

被折叠的 条评论
为什么被折叠?



