给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
- 怎么判断重叠: 两区间的最小的右边界 大于或等于 两区间最大的左边界. 如
[1,5]
和[2,8]
- 入参是切片的切片(intervals), 拿
intervals[0]
与它后面的所有区间对比, 从intervals[1]
开始, 如果有与之重叠的区间, 就把合并后的新区间赋给intervals[0]
, 并删除参与合并的那个旧区间 intervals[0]
完成后, 拿``intervals[1]与它后边的所有区间对比, 从
intervals[2]开始, 如果有与之重叠的区间, 就把合并后的新区间赋给
intervals[1]`, 并删除参与合并的那个就区间- 拿
intervals[i]
与它后边的所有区间对比, 从intervals[i+1]
开始, 如果有与之重叠的区间intervals[j] , 就把合并后的新区间赋给intervals[i]
, 并删除参与合并的intervals[j] - 如果第3步出现了有重叠的区间
intervals[j]
, 那么合并后i
的值变了, 就有可能由原来 在i
到j
之间没有重叠的区间 变成 有重叠的区间, 所以需要从头(i+1
) 再遍历一次, 直到再也没有重叠的区间 - 重复, 一直到切片末尾
code
func min(x, y int) int {
if x < y {
return x
}
return y
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
func merge(intervals [][]int) [][]int {
for i := 0; i < len(intervals); {
merged := false
for j := i + 1; j < len(intervals); j++ {
x, y := intervals[i], intervals[j]
if min(x[1], y[1]) >= max(x[0], y[0]) {
merged = true
//重新赋值
intervals[i][0], intervals[i][1] = min(x[0], y[0]), max(x[1], y[1])
//删除j
intervals[j] = intervals[len(intervals) - 1]
intervals = intervals[:len(intervals) - 1]
}
}
if merged {
continue
}
i++
}
return intervals
}