2406. 将区间分为最少组数

106 阅读1分钟

题目:
给你一个二维整数数组 intervals ,其中 intervals[i] = [lefti, righti] 表示  区间 [lefti, righti] 。

你需要将 intervals 划分为一个或者多个区间  ,每个区间  属于一个组,且同一个组中任意两个区间 不相交 。

请你返回 最少 需要划分成多少个组。

如果两个区间覆盖的范围有重叠(即至少有一个公共数字),那么我们称这两个区间是 相交 的。比方说区间 [1, 5] 和 [5, 8] 相交。
算法:
方法一:贪心

func minGroups(intervals [][]int) int {
    // 最小堆heap的元素为每个分组的右边界right值,堆顶的分组right最小
    myHeap := Heap{}
    // 按照left排序intervals
    sort.Slice(intervals, func(i, j int) bool {
        return intervals[i][0] < intervals[j][0]
    })
    for _, p := range intervals {
        // 当前interval的left,小于等于right最小的分组的right,则只能开一个新的分组放到heap中
        // 否则可以至少可以更新right最小分组的right
        // heap保持堆顶总是right最小的分组
        if myHeap.Len() == 0 || p[0] <= myHeap[0] {
            heap.Push(&myHeap, p[1])
        } else {
            // Fix()相当于heap.Remove(1),然后heap.Push(x)但是复杂度更低
            myHeap[0] = p[1]
            heap.Fix(&myHeap, 0)
        }
    }
    return myHeap.Len()
}

type Heap []int
func (h Heap) Len() int {return len(h)}
func (h Heap) Less(i, j int) bool {return h[i] < h[j]}
func (h Heap) Swap(i, j int)  {h[i], h[j] = h[j], h[i]}
func (h *Heap) Push(x interface{})  {
    *h = append(*h, x.(int))
}
func (h *Heap) Pop() interface{} {
    n := len(*h)
    old := *h 
    x := old[n - 1]
    *h = old[:n-1]
    return x
}