Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
解题思路
- 首先快速排序,然后逐个向后合并
func max(a, b int) int {
if a > b {
return a
}
return b
}
func part(left, right int, intervals *[][]int) int {
key := (*intervals)[left]
for left < right {
for left < right && (*intervals)[right][0] >= key[0] {
right--
}
(*intervals)[left] = (*intervals)[right]
for left < right && (*intervals)[left][0] <= key[0] {
left++
}
(*intervals)[right] = (*intervals)[left]
}
(*intervals)[left] = key
return left
}
func quicksort(left, right int, intervals *[][]int) {
if left < right {
mid := part(left, right, intervals)
quicksort(left, mid-1, intervals)
quicksort(mid+1, right, intervals)
}
}
func merge(intervals [][]int) [][]int {
if len(intervals) <= 1 {
return intervals
}
// 排序
quicksort(0, len(intervals)-1, &intervals)
result := [][]int{}
for i := 0; i < len(intervals); i++ {
if i == len(intervals)-1 {
result = append(result, intervals[i])
return result
}
t := make([]int, 2)
first := intervals[i]
second := intervals[i+1]
if first[1] >= second[0] {
t[0], t[1] = first[0], max(first[1], second[1])
} else {
result = append(result, first)
continue
}
for i = i + 2; i < len(intervals); i++ {
next := intervals[i]
if t[1] >= next[0] {
t[1] = max(t[1], next[1])
} else {
break
}
}
i--
result = append(result, t)
}
return result
}