2021-09-28:合并区间。以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。力扣56。
福大大 答案2021-09-28:
按开始位置排序。i的开始位置比之前的结束位置,需要计数。
时间复杂度:排序的。
额外空间复杂度:O(1)。原数组复用。
代码用golang编写。代码如下:
package main import ( "fmt" "sort" ) func main() { intervals := [][]int{{1, 3}, {2, 6}, {8, 10}, {15, 18}} ret := merge(intervals) fmt.Println(ret) } func merge(intervals [][]int) [][]int { if len(intervals) == 0 { return [][]int{} } sort.Slice(intervals, func(i, j int) bool { return intervals[i][0] < intervals[j][0] }) s := intervals[0][0] e := intervals[0][1] size := 0 for i := 1; i < len(intervals); i++ { if intervals[i][0] > e { intervals[size][0] = s intervals[size][1] = e size++ s = intervals[i][0] e = intervals[i][1] } else { e = getMax(e, intervals[i][1]) } } intervals[size][0] = s intervals[size][1] = e size++ return intervals[0:size] } func getMax(a int, b int) int { if a > b { return a } else { return b } }
执行结果如下: