合并区间

合并区间题目的排序合并思路与实现示例

#type / howto #status / evergreen #topic / leetcode100 #resource / algorithm #source / leetcode #algo / greedy

[!info] related notes

合并区间

分析

应该直接按照数组第一位升序,然后遍历每个数组,看 第二个数组的 第一位 和 第一个数组的第二位比较大小

解法

function merge(intervals: number[][]): number[][] {
    let sorted = intervals.sort((a, b) => a[0] - b[0]);

    let ans = [];
    let left = 0,right = 0;
    for (let i = 0; i < intervals.length; i++) {
        left = intervals[i][0];
        right = intervals[i][1];
        while (i < intervals.length - 1 && right >= intervals[i+1][0] ) {
            right = Math.max(right, intervals[i+1][1]);
            i++;
        }
        ans.push([left,right]);

    }
    
    return ans;
};

ai 给出算法,更优雅

function merge(intervals: number[][]): number[][] {
    // 1. 按照左边界从小到大排序
    intervals.sort((a, b) => a[0] - b[0]);

    // 2. 初始化结果数组,先将第一个区间放入
    let ans: number[][] = [];
    ans.push(intervals[0]);

    // 3. 从第二个区间开始遍历
    for (let i = 1; i < intervals.length; i++) {
        let current = intervals[i];
        // 获取结果数组中最后一个区间(即当前正在试图合并的区间)
        let lastMerged = ans[ans.length - 1];

        // 4. 判断是否重叠
        // 如果当前遍历的区间左边界 <= 最后一个合并区间的右边界,说明有重叠
        if (current[0] <= lastMerged[1]) {
            // 合并区间:更新右边界为两者的最大值
            lastMerged[1] = Math.max(lastMerged[1], current[1]);
        } else {
            // 没有重叠,说明上一个区间已经合并完毕,当前区间是一个新的开始
            ans.push(current);
        }
    }

    return ans;
};
创建于 2026/3/5 更新于 2026/5/27