这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
前言
每日用js写一道算法题,今天来一道处理数组格式的算法题,合并区间,把相同的区间合并成一个大区间,最后输出最终结果
题目描述
以数组 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] 可被视为重叠区间。
题目分析和解题思路
- 从题意可知,这是一个二维数组,我们要合并一维数组中的每一个有相同区间的项,这里可能存在多种情况,前一项和后一项没有任何相同区间的情况,前一项完全包含后一项的情况,前一项的第一个值大于第二项的第一个值的情况,等等,是不是感觉很复杂
- 其实这题的关键就是我们首先要把这个二维数组进行排序,这样我们得到的一维数组就只有三种情况了,要么是后一项的区间在前一项中,要不是两个毫无相同区间的两个区间,要不是有一部分相同区间的两个区间(注意:这里要取两个区间的结束值的最大值作为合并区间的结束值)
- 还要注意的一点是,当循环结束的时候要记得判断curr是否为空,也就是最后一次比较的时候后一项和前一项毫无相同区间的情况,这时要再push进一个curr
- 大致就是如此,下面上代码
var merge = function(intervals) {
if(intervals.length<2){
return intervals
}
intervals.sort((a,b)=>{
return a[0]-b[0]
})
let curr = intervals[0]
let result = []
for(let interval of intervals){
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
};
总结
本题目的重点就是要想到给二维数组排序,要不然处理起来会非常麻烦,其次就是当两个区间有相同区间的时候,合并的时候要把两个项的最大值最为合并项的结束值