LeetCode 数据结构基础 - 合并区间

130 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

合并区间

原题地址

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [ startistart_{i} , endiend_i] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 10410^4
  • intervals[i].length == 2
  • 0 <= startistart_i <= endiend_i <= 10410^4

思路分析

  1. 从题目可以得知需要最大范围的找到可以「被吃掉」的元素。
  2. 为了不漏掉数组中的某些元素,我们首先将数组按照元素中的首项进行升序排序。此处使用 Array.sort() 方法。
  3. 排序后,遍历数组,找到数组的下一项 next 的首项与当前值 current 的末项进行比较,如果 current 的末项 大于等于 next 的首项,那么我们认为这两个元素可以合并,此时 current 的末项应该取 current 的末项和 next 的末项的最大值,即 current[1] = Math.max(next[1], current[1])
  4. current 的末项 小于 next 的首项,则认为数组不可被合并,将 current 直接 push 到结果集 res 中即可,此时并将 current 调整为 next 的值。
  5. 返回 结果集 res

AC 代码

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0])
    const res = []
    let current = intervals[0]
    for(let i = 1; i < intervals.length; i++) {
        const next = intervals[i]
        if(current[1] >= next[0]) {
            current[1] = Math.max(next[1], current[1])
        } else {
            res.push(current)
            current = next
        }
    }
    res.push(current)
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:88 ms, 在所有 JavaScript 提交中击败了83.29%的用户
  • 内存消耗:47.4 MB, 在所有 JavaScript 提交中击败了38.77%的用户
  • 通过测试用例:169 / 169

END