跳转至

区间

56. 合并区间

难度:⭐️⭐️⭐️

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

解法一 排序

对区间按左值排序,在循环中区间有重叠时合并,右值取最大值,没有重叠时,不合并。

左值排序
  public int[][] merge(int[][] intervals) {
      Arrays.sort(intervals, (int[] a, int[] b) -> {
          return a[0] - b[0];
      });
      List<int[]> resultList = new ArrayList<>();
      resultList.add(intervals[0]);
      for (int i = 1; i < intervals.length; i++) {
          int[] range = intervals[i];
          int[] merged = resultList.get(resultList.size() - 1);
          if (range[0] > merged[1]) {
              resultList.add(range);
          } else {
              merged[1] = Math.max(range[1], merged[1]);
          }
      }
      return resultList.toArray(new int[resultList.size()][]);
  }