[路飞]合并区间

139 阅读1分钟

记录 1 道算法题

合并区间

56. 合并区间 - 力扣(LeetCode) (leetcode-cn.com)


要求:给一个二维数组,每一项元素是一个集合,里面是升序排列的数,将范围有重叠的集合合并起来。输出结果也是一个二维数组。

比如:[[1,3],[2,6],[8,10],[15,18]] 输出结果:[[1,6],[8,10],[15,18]]

解题方法很简单,重叠的特点是后面集合的左边界小等于前面集合的右边界,问题是数组可能是乱序的,解决办法是先将二维数组升序排序,确保集合的左边界是升序的,这样后面的集合一定在前面集合的右边,就可以通过比较右边界得出答案。

    function merge(intervals) {
        intervals.sort((a, b) => a[0] - b[0])
        // 排序后第一个集合可以直接放进结果数组
        const result = [intervals[0]]
        // 接下来从第二个开始遍历
        for(let i = 1; i < intervals.length; i++) {
            const inte = intervals[i]
            const last = result[result.length - 1]
            // 比较是否和结果数组的最后一项的右边界有交集,没有就 push,有就合并
            if (inte[0] <= last[1]) {
                // 有可能当前遍历到的集合的右边界比结果数组的最后一个的右边界小,
                // 就是全覆盖的情况
                last[1] = Math.max(inte[1], last[1])
            } else {
                result.push(inte)
            }
        }
        
        return result
    }