Featured image of post 56. 合并区间

56. 合并区间

题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

  • 输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
  • 输出:[[1,6],[8,10],[15,18]]
  • 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

  • 输入:intervals = [[1,4],[4,5]]
  • 输出:[[1,5]]
  • 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解法一:排序 + 贪心

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func merge(intervals [][]int) [][]int {
    n := len(intervals)
    sort.Slice(intervals, func(i, j int) bool {
        a, b := intervals[i], intervals[j]
        return a[0] < b[0] || a[0] == b[0] && a[1] > b[1]
    })
    var ans [][]int
    left, right := intervals[0][0], intervals[0][1]
    for i := 1; i < n; i++ {
        if intervals[i][0] == intervals[i-1][0] {
            continue
        } else if intervals[i][0] <= right {
            if intervals[i][1] > right {
                right = intervals[i][1]
            }
        } else {
            // intervals[i][0] > right
            ans = append(ans, []int{left, right})
            left, right = intervals[i][0], intervals[i][1]
        }
    }
    ans = append(ans, []int{left, right})
    return ans
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/05/19 09:31:06
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计