14.合并区间

55 阅读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].

解法1 排序+

思路

合并两个区间其实就是在看他们有没有交集。如何看判断是否有交集呢:左区间的右端点大于等于右区间的左端点。而这一条件需要左区间和右区间是有序排列,如果不是则会出现其他情况。所以首先第一步需要对这个数组按第一位进行排序。之后来比较区间的端点,如果有交集,则加入到答案中去。

代码

function merge(intervals: number[][]): number[][] {
    if (intervals.length == 0) {
        return [];
    }

    intervals.sort((a, b) => a[0] - b[0]);
    const merged: number[][] = [];

    // 初始化第一个区间
    let currentInterval = intervals[0];
    for (let i = 1; i < intervals.length; i++) {
        const nextInerval = intervals[i];
        // 如果当前区间的结束值大于等于下一个区间的开始值,说明有重叠
        if (currentInterval[1] >= nextInerval[0]) {
            // 合并区间,取最大结束值
            currentInterval[1] = Math.max(nextInerval[1], currentInterval[1]);
        } else {
            // 如果没有重叠,将当前区间加入结果数组,更新当前区间
            merged.push(currentInterval);
            currentInterval = nextInerval;
        }
    }
    // 添加最后的区间
    merged.push(currentInterval);

    return merged;
};

时空复杂度分析

时间复杂度:排序开销 O(n logn),遍历 O(n),所以总的时间复杂度是O(n logn)

空间复杂度:如果把结果算上空间开销是 O(n),额外的排序空间开销是 O(logn)