给出一个区间的集合,请合并所有重叠的区间。

示例 1:

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

示例 2:

1
2
3
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
个人解答
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
// 先根据左顶点进行升序排序
intervals = intervals.sort((a, b) => a[0] - b[0])
for (let i = 0; i < intervals.length - 1; i++) {
const a2 = intervals[i][1] // 当前元素的右顶点
const b1 = intervals[i+1][0] // 下个元素的左顶点
const b2 = intervals[i+1][1] // 下个元素的右顶点
if (a2 >= b1) { // 当前元素的右顶点与下个元素左顶点比较
intervals[i][1] = Math.max(a2, b2)
intervals.splice(i + 1, 1) // 删掉下标 i + 1
i--
}
}

return intervals
}
解题思路
  1. 先按左顶点进行升序排序;
  2. 循环判断 intervals[i][1] >= intervals[i+1][0],即当前元素右顶点与下个元素左顶点比较;
  3. 当前元素右顶点取值,符合条件删除下一个元素 intervals[i+1]。

注:

边界i<intervals.length-1

因为删除元素,数组变短了。此时: i–