【42.合并区间】

80 阅读1分钟

题目

以数组 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].

题解

方式一:排序

public int[][] merge(int[][] intervals) {
    // 首元素升序
    Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
    // LinkedList插入更快
    List<int[]> result = new LinkedList<>();
    // 指针指向第一个元素
    int[] cur = intervals[0];
    for (int[] interval : intervals) {
        if (cur[1] >= interval[0]) {
            // 需要合并,更新右边界
            cur[1] = Math.max(cur[1], interval[1]);
        } else {
            // 不需要合并,加入结果集,移动指针
            result.add(cur);
            cur = interval;
        }
    }
    // 处理最后一个区间被合并的情况
    result.add(cur);
    return result.toArray(new int[0][]);
}

总结

算法:自定义比较器