LeetCode 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].

题目分析

把区间按起点从小到大排序。
从第一个开始尝试合并,如果后面的区间和当前区间有重叠,就合并。
否则就将当前区间入库,把下一个区间当作起点继续尝试合并。
主要耗时在排序,因此时间复杂度 O(n * log n)

Java

public int[][] merge(int[][] intervals) {
    Arrays.sort(intervals, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            return Integer.compare(o1[0], o2[0]);
        }
    });

    int count = 0;
    int[] cur = intervals[0];
    for (int[] array : intervals) {
        if (array[0] > cur[1]) {
            intervals[count++] = cur;
            cur = array;
        } else if (array[1] > cur[1]) {
            cur[1] = array[1];
        }
    }
    intervals[count++] = cur;
    return Arrays.copyOf(intervals, count);
}

Kotlin

fun merge(intervals: Array<IntArray>): Array<IntArray> {
    val ans = mutableListOf<IntArray>()
    Arrays.sort(intervals, object : Comparator<IntArray> {
        override fun compare(o1: IntArray, o2: IntArray): Int {
            return o1[0].compareTo(o2[0])
        }
    })

    var cur = intervals[0]
    for (array in intervals) {
        if (array[0] > cur[1]) {
            // 出现间隔,前面的数据入库
            ans.add(cur)
            cur = array
        } else if (array[1] >= cur[1]) {
            // 需要合并
            cur[1] = array[1]
        }
    }
    ans.add(cur)
    return ans.toTypedArray()
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部