【每日一题Day307】LC56合并区间 | 排序

合并区间【LC56】

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/c5tv3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 思路:模拟

    按照左边界排序,排序之后,判断区间和前一个区间是否有重叠部分,有则进行合并;每次合并都取最大的右边界

  • 实现

    • 先对输入数组按照区间左边的值进行升序排列

    • 初始化一个变量 outputs,用于存储合并直接的区间结果

    • 遍历排序后的所有区间,针对每个区间做如下的处理:

      1. 如果当前处理的区间是第一个区间的话,那么直接将区间加入到 outputs
      2. 比较当前处理区间左边的值 (currLeft) 和 outputs 中最后一个区间右边的值 (outputsLastRight) :
        • 如果 outputsLastRight < currLeft,说明没有重叠,那么直接将当前处理的区间加入到 outputs
        • 否则,说明有重叠,那么将 outputs 中最后一个区间的右边的值更新为:当前处理区间右边值和 outputsLastRight 的最大值
      3. 将 outputs 转成数组,并返回
    • 代码

      public int[][] merge(int[][] intervals){
      
          
          //1.先对输入数组按照区间左边的值进行升序排列
          Arrays.sort(intervals, new Comparator<int[]>() {
              @Override
              public int compare(int[] o1, int[] o2) {
                  return o1[0]-o2[0];
              }
          });
          //2.初始化一个变量outputs,用于存储合并直接的区间结果
          List<int []> outputs = new ArrayList<>();
          //将第一个区间直接加入outputs
          outputs.add(intervals[0]);
          for (int i = 1; i < intervals.length; i++) {
              //比较当前处理的区间左边的值和outputs中最后一个区间右边的值
              if(intervals[i][0] > outputs.get(outputs.size()-1)[1]){//没有重叠
                  outputs.add(intervals[i]);
              }else{
                  outputs.get(outputs.size()-1)[1] = Math.max(outputs.get(outputs.size()-1)[1],intervals[i][1]);
      
              }
      
          }
          //3.转换为数组
          return outputs.toArray(new int[outputs.size()][]);
      }
      

你可能感兴趣的:(每日一题,leetcode)