说在前面
🎈今天给大家带来的是算法练习,题目为"合并区间"。
问题描述
以数组 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 <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
思路分析
题目要求是要我们对给出的区间数组进行化简,将有有重复或者首尾连接的区间合并成一个区间,如区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
,所以我们只需要将数组排个序,然后遍历一遍就可以得出结果,具体如下:
- 1、区间排序
左端点小的在前面\
左端点相等时右端点小的在前面
intervals = intervals.sort((a,b)=>{
if(a[0] == b[0]) return a[1] - b[1];
return a[0] - b[0];
})
- 2、维护区间的左右端点
如果上一个区间的右端点大于等于当前区间的左端点,则说明两区间有重叠部分,左端点不变,右端点应该更新为当前区间的右端点;\
如果上一个区间的右端点小于当前区间的左端点,则说明两区间没有重叠部分,应该将上一个区间放入结果集合,并将当前区间作为维护区间继续往后遍历。
AC代码
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
if(intervals.length == 1) return intervals;
let res = [];
intervals = intervals.sort((a,b)=>{
if(a[0] == b[0]) return a[1] - b[1];
return a[0] - b[0];
})
let l = intervals[0][0],r = intervals[0][1];
for(let i = 1; i < intervals.length; i++){
if(intervals[i][0] > r){
res.push([l,r]);
l = intervals[i][0];
r = intervals[i][1];
}else{
r = Math.max(r,intervals[i][1]);
}
if(i === intervals.length - 1) res.push([l,r]);
}
return res;
};
说在后面
🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。