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
    }
}

执行结果如下:
图片


左神java代码