题目
以数组 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 };
坚持努力,无惧未来!