题目描述
以数组 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 <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
代码及注释
go
func merge(intervals [][]int) [][]int {
res := make([][]int, 0) // 结果数组
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0] // 按照区间的起始位置排序
})
if len(intervals) == 0 {
return res // 如果区间数组为空,直接返回空数组
}
left, right := intervals[0][0], intervals[0][1] // 初始化左右边界为第一个区间的边界
for i := 1; i < len(intervals); i++ {
if intervals[i][0] <= right && intervals[i][1] > right {
right = intervals[i][1] // 更新右边界
} else if intervals[i][0] > right {
res = append(res, []int{left, right}) // 当前区间与前一个区间无重叠,将前一个区间添加到结果数组
left, right = intervals[i][0], intervals[i][1] // 更新左右边界
}
}
res = append(res, []int{left, right}) // 添加最后一个合并后的区间
return res
}
代码解释
-
初始化结果数组:
res
是用于存储合并后的区间的结果数组。
-
按照区间的起始位置排序:
- 使用
sort.Slice
函数对intervals
数组按照区间的起始位置进行排序。
- 使用
-
处理边界情况:
- 如果
intervals
数组为空,直接返回空的结果数组res
。 - 初始化左右边界为第一个区间的边界
intervals[0][0]
和intervals[0][1]
。
- 如果
-
合并区间:
- 遍历排序后的
intervals
数组。 - 如果当前区间的起始位置
intervals[i][0]
小于等于当前的右边界right
且当前区间的结束位置intervals[i][1]
大于当前的右边界right
,更新右边界right
。 - 如果当前区间的起始位置
intervals[i][0]
大于当前的右边界right
,表示当前区间与前一个区间无重叠,将前一个区间[left, right]
添加到结果数组res
,然后更新左右边界。
- 遍历排序后的
-
添加最后一个区间:
- 遍历完成后,将最后一个合并后的区间
[left, right]
添加到结果数组res
。
- 遍历完成后,将最后一个合并后的区间
-
返回结果:
- 返回结果数组
res
。
- 返回结果数组
这段代码的时间复杂度是 O(nlogn),其中 n 是区间的数量,因为需要对区间进行排序。