56. 合并区间

135 阅读1分钟

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/me… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法:

import "sort"
func merge(intervals [][]int) [][]int {
    arr := Arrs{Val:intervals}
    sort.Sort(arr)
    ans := make([][]int, 0)
    lasIndex := 0
    for i := 0 ; i < len(arr.Val); i = i + 1{
        if i == 0 || ans[lasIndex][1] < arr.Val[i][0] {
            ans = append(ans, arr.Val[i])
            lasIndex = len(ans) - 1 // 注意更新lastIndex
        } else {
           ans[lasIndex] =  mymerge(ans[lasIndex], arr.Val[i])
        }

    }


    return ans
}

func mymerge(a, b []int) []int{
    start := a[0]
    if b[0] < start {
         start = b[0]
    }
    end := a[1]
    if end < b[1] {
        end = b[1]
    }
    return []int{start, end}
}

type Arrs struct {
    Val [][]int
}

func (a Arrs) Len() int{
    return len(a.Val)
}

func (a Arrs) Swap(i, j int) {
    a.Val[i], a.Val[j] = a.Val[j], a.Val[i]
}

func (a Arrs) Less(i, j int) bool {
    return a.Val[i][0] < a.Val[j][0]
}