56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
解:
- 定义两个变量,left和right。表示当前区间的左右边界。
- 得保证区间数组是按照左边界大小递增的(因为要逐个判断是否重合,如果不是递增的,那么可能在判断完前面的区间后,最后来了个包含所有区间的最大区间),所以先给区间数组排序。
- 遍历区间数组,遍历到的区间的左边界小于等于当前区间的右边界并且有边界大于等于当前区间的左边界就表明两个区间有重合部分,更新区间的左右边界。
- 当不存在重合部分时,就表明遍历到的是一个新区间,所以把当前区间先放入结果数组,然后把left和right更新成遍历到的区间左右边界即可。
- 遍历结束时,再把最后的left,right也放入结果数组。
const merge = function(intervals) {
if (!intervals || !intervals.length) return []
intervals.sort((a, b) => a[0] - b[0])
let left = intervals[0][0]
let right = intervals[0][1]
const res = []
for (let i = 0; i < intervals.length; i++) {
if (intervals[i][0] <= right && intervals[i][1] >= left) {
left = Math.min(left, intervals[i][0])
right = Math.max(right, intervals[i][1])
} else {
res.push([left, right])
left = intervals[i][0]
right = intervals[i][1]
}
}
res.push([left, right])
return res
};