LeetCode57. 插入区间
题目描述
/**
*
* 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
* <p>
* 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠
* <p>
* (如果有必要的话,可以合并区间)。
*
*/
思路分析
- 因为原始区间列表是无重叠的,并且按照起始端点排好序的,因此要插入的区间有两种情况,要么和原始区间没有重叠,要么和原始区间重叠
- 考虑不重叠:
- 遍历原始区间,如果当前区间的左侧范围大于要插入的区间的右侧范围,说明要插入的区间整体在当前区间左侧,先将这个区间插入,再插入当前区间
- 如果当前区间的右侧范围小于要插入区间的左侧范围,说明要插入的区间整体当前区间的右侧,则直接插入当前区间
- 否则要插入的区间和当前区间重叠
- 考虑重叠,将这两个区间的最大范围作为新的要插入的区间,和下一次遍历的区间做对比,依次比较,即重置要插入的区间范围
- 定义标志位判断要插入的区间是否插入,如果在循环结束时还没有插入,说明要插入的区间在这个原始区间的右侧,则需要插入到最后
- 源码即详解见下
源码及分析
/**
*
* @param intervals 原始区间范围
* @param newInterval 要插入的新区间
* @return 返回插入后的结果
*/
public int[][] insert(int[][] intervals, int[] newInterval) {
//先进行数据校验
if (intervals.length == 0) {
return new int[][]{{newInterval[0], newInterval[1]}};
}
//定义变量 left 和 right 保存要插入区间的左右范围
int left = newInterval[0];
int right = newInterval[1];
//定义一个标志位判断要插入元素是否插入,默认为false
boolean flag = false;
//创建集合保存新的区间
ArrayList<int[]> list = new ArrayList<>();
//判断新区间和二维数组中一维数组元素的大小关系
for (int[] interval : intervals) {
//从二维数组中的第一个元素开始遍历,如果当前元素的左侧范围 > right ,说明要插入的位置在当前元素之前,直接插入
if (interval[0] > right){
if (!flag){
list.add(new int[]{left,right});
flag = true;
}
//再插入当前元素
list.add(interval);
//如果当前元素的右侧范围小于要插入元素的左侧范围,说明要插入的元素在当前范围的右侧
}else if (interval[1] < left){
//直接插入当前元素
list.add(interval);
}else {
//重置左右边界
left = Math.min(interval[0],left);
right = Math.max(interval[1],right);
}
}
//如果遍历结束后还没有插入,说明待插入元素范围在这个二维数组所有范围的最右侧,则插入到最后
if (!flag){
list.add(new int[]{left,right});
}
//将集合以数组形式返回
return list.toArray(new int[list.size()][]);
}