[路飞][LeetCode]56_合并区间

145 阅读1分钟

「这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

以数组 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].

示例 2:

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

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解题思路

  • 我们首先将数组长度为1的特殊情况进行处理,长度为1时,直接返回原数组即可
  • 然后我们将输入的数组按子数组的第一项的升序进行排列
  • 然后将数组的第一项作为当前正在做合并操作的项
  • 遍历数组,如果遍历到的元素的start不大于正在做合并处理的end,就将这两个进行合并
  • 否则,将当前正在做合并操作的项推入数组,并将遍历到的项设置为正在做合并操作
  • 遍历完成后将合并操作项塞入数组!!!

解题代码

var merge = function(intervals) {
    if(intervals.length==1) return intervals // 处理数组长度为1的特殊情况
    intervals.sort((a,b)=> a[0]-b[0])  // 升序排列
    let current = intervals[0]
    const res = []
    for(let interval of intervals){
        if(current[1]>= interval[0]){ // interval的start不大于current的end进行合并
            current[1] = Math.max(current[1],interval[1]) // 合并时,右侧取两个end中较大的
        }else{
            res.push(current)
            current = interval
        }
    }
    res.push(current) // 最后一定要记得将合并的项放入数组
    return res
};

世界大雨滂沱,万物苟且而活。

如有任何问题或建议,欢迎评论区留言讨论!