【leetcode】56. 合并区间

70 阅读1分钟

leetcode-56.png

这一题的思路主要在于前期需要排序,后面按照耿直的思路做就好了
这里的重点在于什么时候把构成的区间push进入res数组中

错误代码

这里push进入res数组中的时机有问题,如果当前的区间与first区间不相交,则会导致first区间不会push到res中,进而导致错误

错误代码-测试用例.png

var merge = function (intervals) {
    if (intervals.length <= 1) return intervals
    intervals.sort((a, b) => a[0] - b[0])
    let first = intervals[0]
    let res = []
    for (let i = 1; i < intervals.length; ++i) {
        if (first[1] >= intervals[i][0]) {
            first = [first[0], intervals[i][1]]
        } else {
            first = intervals[i]
        }
        res.push(first)
    }
    return res
};

正确代码

所以这里push进入的时机需要商榷,如果此时两个区间不相交,那就进入到了else中,在这里,就需要第一时间push进入res中,并更新first

var merge = function (intervals) {
    if (intervals.length <= 1) return intervals
    intervals.sort((a, b) => a[0] - b[0])
    let first = intervals[0]
    let res = []
    for (let i = 1; i < intervals.length; ++i) {
        if (first[1] >= intervals[i][0]) {
            first = [first[0], Math.max(first[1], intervals[i][1])]
        } else {
            // 区间不相交,则push进入结果之中,并更新first
            res.push(first)
            first = intervals[i]
        }
    }
    // 因为每次push进入的first都是上一轮更新好的区间
    // 到最后一个区间的时候,已经跳出循环,此时需要把最后一个区间push到res中
    res.push(first)
    return res
};