力扣刷题-合并区间

96 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

题目

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

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

题解

这道题主要是看两个数组间是否有交际,何为交际,我们需要去一个一个的读取所有的数,第二个数组中的数,小于或者等于第一个数组的数字的区间,就可以判断为有交际,所以我们可以将数组汇总的区间按照起始位置进行排序,声明一个curr变量指向一个数组,它用于记录当前合并的最大区间,遍历数组中的每一个区间,如果当前区间的起始位置小于curr的终点位置,则可以继续合并,合并后并更新curr的起始位置和终止位置,如果当前区间的起始位置大于curr的终止位置则无法进行合并,所以需要将curr数组加入到返回结果汇总,用当前区间的替换掉curr数组的值

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
    // 如果里面只有一个区间,则直接返回
if(intervals.length<2)return intervals;
//将区间进行排序,我们只关心其起始位置,所以我们这里只对起始位置进行排序
intervals.sort((a,b)=>a[0]-b[0])
// 存储正在被合并的区间
let curr=intervals[0];
// 结果数组
let result=[]
// 遍历数组
for(let interval of intervals){
    // 如果curr[1]的位置大于等于interval[0]起始位置的话则进行合并
    if(curr[1]>=interval[0]){
        // 比较出最大值设置为终止位置
        curr[1]=Math.max(curr[1],interval[1])
    }else{
        // 将当前合并区间存储到结果中
        result.push(curr)
        curr=interval
    }
}
// 判断合并区间还有东西没有,有则添加到结果中
if(curr.length!==0){
      result.push(curr)
}
// 返回结果
return  result
};

坚持努力,无惧未来!