自学内容网 自学内容网

力扣57. 插入区间

描述

力扣57. 插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals。

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

提示:
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 105
intervals 根据 starti 按 升序 排列
newInterval.length == 2
0 <= start <= end <= 105

方法:遍历融合区间

思路:
记需要插入的区间newInterval的起点为leftNum,终点为RightNum.我们遍历被插入区间intervals,如果插入区间和被插入区间存在重叠,那么我们取并集直接融合区间。有重叠我们就融合,直到没有重叠,那么就将最后的区间放入答案集合。具体代码实现及详细注释如下。
具体实现及注释:

class Solution {
   public int[][] insert(int[][] intervals, int[] newInterval) {
       //从插入区间中取出起始点的值
       int leftNum = newInterval[0];
       int rightNum = newInterval[1];
       //这个是用来标记区间是否已入答案集合,我们在后文结合具体代码解释
       boolean flag = false;
       //临时存放答案的集合
       List<int[]> ans = new ArrayList<>();
       for (int[] interval : intervals) {
           //如果newInterval的起点大于interval的终点,则代表没有重合,将interval入答案集合。
           if (leftNum > interval[1]) ans.add(interval);
           //如果newInterval终点第一次小于interval的起点,则找到插入区间的位置,均入答案集合
           else if (rightNum < interval[0]) {
               //这个flag是用来标记newInterval是否已经插入过区间。因为一旦当rightNum < interval[0]
               //rightNum必然也小于后续interval数组的起点,但我们只需要第一次插入newInterval,所以用flag标记,当第一次插入后将flag修改为true,则后续不会进行此操作
   
               if (flag == false) {
                   ans.add(new int[]{leftNum, rightNum});
                   flag = true;
               }
               ans.add(interval);
               //这个便是有交集的情况,我们融合区间取并集
           } else {
               leftNum = Math.min(leftNum, interval[0]);
               rightNum = Math.max(rightNum, interval[1]);
           }
       }
       //这个是因为存在无法满足rightNum < interval[0],比如intervals为空,或者rightNum比intervals区间中最大的数都大,这些情况直接将其入结果集合即可
       if (flag == false) ans.add(new int[]{leftNum, rightNum});
       int[][] finalAns = new int[ans.size()][2];
       for (int i = 0; i < finalAns.length; i++) {
           finalAns[i] = ans.get(i);
       }
       return finalAns;
   }   
}

原文地址:https://blog.csdn.net/dastatham/article/details/142548754

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!