LeetCode57. 插入区间

LeetCode57. 插入区间

题目描述

/**
     * 
     * 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
     * <p>
     * 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠
     * <p>
     * (如果有必要的话,可以合并区间)。
     * 
     */

思路分析

  1. 因为原始区间列表是无重叠的,并且按照起始端点排好序的,因此要插入的区间有两种情况,要么和原始区间没有重叠,要么和原始区间重叠
  2. 考虑不重叠:
  3. 遍历原始区间,如果当前区间的左侧范围大于要插入的区间的右侧范围,说明要插入的区间整体在当前区间左侧,先将这个区间插入,再插入当前区间
  4. 如果当前区间的右侧范围小于要插入区间的左侧范围,说明要插入的区间整体当前区间的右侧,则直接插入当前区间
  5. 否则要插入的区间和当前区间重叠
  6. 考虑重叠,将这两个区间的最大范围作为新的要插入的区间,和下一次遍历的区间做对比,依次比较,即重置要插入的区间范围
  7. 定义标志位判断要插入的区间是否插入,如果在循环结束时还没有插入,说明要插入的区间在这个原始区间的右侧,则需要插入到最后
  8. 源码即详解见下

源码及分析

/**
     * 
     * @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()][]);
    }
posted @ 2021-06-01 11:36  mx_info  阅读(53)  评论(0)    收藏  举报