56.合并区间


题目:56.合并区间

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

  • 示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
  • 示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
  • 提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4

思路

  1. 输入检查

    • 如果输入数组为空或只有一个区间,直接返回输入。
  2. 排序区间

    • 使用 Arrays.sort 方法对区间按照起始位置进行排序。
  3. 初始化结果列表和当前区间

    • 创建一个 List<int[]> 用于存储合并后的区间。
    • 初始化第一个区间为当前区间,并将其加入结果列表。
  4. 遍历排序后的区间

    • 对于每个区间,检查它是否与当前区间重叠。
    • 如果重叠,合并它们,即更新当前区间的结束位置为两者结束位置的最大值。
    • 如果不重叠,将当前区间更新为下一个区间,并将其加入结果列表。
  5. 返回结果

    • 将结果列表转换为二维数组并返回。
  • 时间复杂度:O(nlog₂n)
  • 空间复杂度:O(n)

代码

public int[][] merge(int[][] intervals) {
    if (intervals.length == 0 || intervals.length == 1) {
        return intervals;
    }
    List<int[]> mergedIntervals = new ArrayList<>();
    // 按区间的起始位置排序
    Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
    // 初始化第一个区间为当前区间
    int[] currentInterval = intervals[0];
    // 将当前区间加入列表
    mergedIntervals.add(currentInterval);
    for (int[] interval : intervals) {
        // 如果当前区间的结束位置大于等于下一个区间的开始位置,说明有重叠,合并区间
        if (interval[0] <= currentInterval[1]) {
            currentInterval[1] = Math.max(currentInterval[1], interval[1]);
        } else {
            // 否则,没有重叠,更新当前区间为下一个区间,并将其加入结果列表
            currentInterval = interval;
            mergedIntervals.add(currentInterval);
        }
    }
    // 将结果列表转换为二维数组并返回
    return mergedIntervals.toArray(new int[mergedIntervals.size()][]);
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录