leetcode 56. 合并区间

149 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

以数组 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] 可被视为重叠区间。

思路分析:

我们需要一个没有重叠部分的区间数组,将intervals数组中的所有数组都收集到里面,并且将所有重叠的数组都进行合并。

那么我们如何来判别数组是否重叠呢,就是数组1的起始是否小于等于数组2的起始并且数组1的终点是否大于等于数组2的起始,如果满足那就说明两个数组是重叠数组,然后可以再判断数组1的终点是否大于数组2的终点来决定谁才是新数组的终点。通过这样的比较方式,我们可以将数组中的每个元素都进行比较一次就能知道数组中的重叠元素是哪些了,那么如何较为快速的把数组的元素都进行比较。

如果直接进行比较的话,我们需要把每个数组元素都与其他数组元素循环比较一次时间复杂度较高,因为是数字数组我们可以通过先对intervals数组进行一个排序,这样让每个元素都只需要与下一个元素进行比较就可以了不需要去循环让每个元素都比较,我们可以对起始然后从左到右一次循环搞定。

代码实现:

var merge = function (intervals) {
    //将数组排序
    intervals.sort((a,b)=>{
        return a[0]-b[0]
    })
    let res = []
    for(let i = 0;i<intervals.length;i++){
        //循环到最后一次直接加入并返回数组
        if(i===intervals.length-1){
            res.push(intervals[i])
            return res
        }
        if(intervals[i][1]>=intervals[i+1][0]){
            intervals[i+1][0] = intervals[i][0]
            intervals[i+1][1] = Math.max(intervals[i][1],intervals[i+1][1])
        }else{
            res.push(intervals[i])
        }
    }
};