题目:
给你一个二维整数数组 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
}