概述
给出一个区间数组,每个区间有一个开始时间和结束时间,合并重叠的区间。如果第一个区间的结束时间大于第二个区间的开始时间,则称两个区间为重叠。这是假设两个区间都是按开始时间排序的。
例子:
假设我们有以下两个区间
[2,6]
[5,8]
那么这些区间是重叠的,因为第一个区间的结束时间大于第二个区间的开始时间。 在这里,上述区间也是按开始时间排序的。
同样,下面两个区间也不重叠。
[2,6]
[8,9]
因此,目标是在给定的区间数组中合并重叠的区间。
例子:
Input: [[1,4], [8,10], [9,12], [3,5]]
Output: [[1,5], [8,12]]
程序
下面的逻辑是
-
根据开始时间对区间阵列进行排序。
-
从索引0开始,合并重叠的区间。如上所述,如果第一个区间的结束时间大于第二个区间的开始时间,则两个区间被称为重叠。
package main
import (
"fmt"
"sort"
)
func main() {
output := merge([][]int{{1, 4}, {8, 10}, {9, 12}, {3, 5}})
fmt.Println(output)
output = merge([][]int{{1, 4}, {4, 5}})
fmt.Println(output)
output = merge([][]int{{2, 2}, {2, 2}})
fmt.Println(output)
output = merge([][]int{{2, 3}, {4, 5}, {6, 7}, {8, 9}, {1, 10}})
fmt.Println(output)
}
type intervalsArray [][]int
func (intA intervalsArray) Len() int {
return len(intA)
}
func (intA intervalsArray) Swap(i, j int) {
intA[i], intA[j] = intA[j], intA[i]
}
func (intA intervalsArray) Less(i, j int) bool {
return intA[i][0] < intA[j][0]
}
func merge(intervals [][]int) [][]int {
intA := intervalsArray(intervals)
sort.Sort(intA)
intervalsSorted := [][]int(intA)
//fmt.Println(intervalsSorted)
var output [][]int
currentIntervalStart := intervalsSorted[0][0]
currentIntervalEnd := intervalsSorted[0][1]
for j := 1; j < len(intervalsSorted); j++ {
if currentIntervalEnd >= intervalsSorted[j][0] {
if intervalsSorted[j][1] > currentIntervalEnd {
currentIntervalEnd = intervalsSorted[j][1]
}
} else {
output = append(output, []int{currentIntervalStart, currentIntervalEnd})
currentIntervalStart = intervalsSorted[j][0]
currentIntervalEnd = intervalsSorted[j][1]
}
}
output = append(output, []int{currentIntervalStart, currentIntervalEnd})
return output
}
输出
[[1 5] [8 12]]
[[1 5]]
[[2 2]]
[[1 10]]