解法一:排序法
解决区间问题的一般思路是先排序,再观察规律
一个区间x可以表示为[start, end],其实按start或end排序都可以,不过为了清晰可见,下面按start排序
观察可以发现,对于几个存在重叠的区间,合并后的结果区间start一定是所有区间中最小的,end一定是所有区间中最大的
由于已经排好序,start从左往右遍历就肯定是从最小的开始,求结果区间的end就可以理解为在所有的相交区间中找出end最大值
func merge(intervals [][]int) [][]int {
// 对所有区间按start从小到大排序
sort.Slice(intervals, func(i, j int) bool{
return intervals[i][0] < intervals[j][0]
})
res := [][]int{}
res = append(res, intervals[0]) // 第一个待合并区间
for i := 1; i < len(intervals); i++{
cur := intervals[i]
last := res[len(res)-1]
if cur[0] <= last[1] { // 区间 x的 start小于等于区间 y的 end才可能重叠,合并区间
last[1] = max(last[1], cur[1]) // 取二者的end较大值
} else{ // 加入待合并区间
res = append(res, cur)
}
}
return res
}
func max(a, b int) int{
if a > b{
return a
}
return b
}