golang 优先队列
作者:互联网
前置条件
golang 优先队列几种构建方式,使用比起其他语言稍微有些复杂
6178. 将区间分为最少组数
- 简单构建优先队列
func minGroups(intervals [][]int) int {
if len(intervals)==0{
return 0
}
//按照前面一个位置进行排序,相等按照后面的升序
sort.Slice(intervals,func(i,j int)bool{
if intervals[i][0]!=intervals[j][0]{
return intervals[i][0]<intervals[j][0]
}
return intervals[i][1]>intervals[j][1]
})
//注意使用时用Heap.Push(&h,val) Heap,Pop(&h) 关于绑定interface问题参考eggo
s:=new(small)
for i:=0;i<len(intervals);i++{
if s.Len()==0||intervals[i][0]<=(*s)[0]{ //当前小于等于堆顶,则需要重新开一个组
heap.Push(s,intervals[i][1])
}else{
(*s)[0] = intervals[i][1] //可以放置,之前替换之前组的末尾数字,重新再平衡,或者 Heap.Pop() 后 Heap.Push()
heap.Fix(s,0)
}
}
return s.Len()
}
// 最小堆 s[0] 为堆顶 heap.Fix(&h,0) 可以从下标位置重新调整堆
type small []int
func (s small)Less(i,j int)bool{
return s[i]<s[j]
}
func (s small)Swap(i,j int){
s[i],s[j] = s[j],s[i]
}
func (s small)Len()int{
return len(s)
}
func (s *small)Push(x interface{}){
tmp:=x.(int)
*s = append(*s,tmp)
}
func (s *small)Pop()interface{}{
x:=(*s)[len(*s)-1]
(*s) = (*s)[:len(*s)-1]
return x
}
标签:优先,return,队列,golang,int,intervals,func 来源: https://www.cnblogs.com/9527s/p/16684512.html