LeetCode56 合并区间

66 阅读1分钟

leetcode.cn/problems/me…

image.png

解法一:排序法

解决区间问题的一般思路是先排序,再观察规律

一个区间x可以表示为[start, end],其实按start或end排序都可以,不过为了清晰可见,下面按start排序

image.png

观察可以发现,对于几个存在重叠的区间,合并后的结果区间start一定是所有区间中最小的,end一定是所有区间中最大的

image.png

由于已经排好序,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
}

参考文章