当前位置: 首页 > news >正文

Go自定义PriorityQueue优先队列使用Heap堆

题目

在这里插入图片描述

分析

每次找最大的,pop出来
然后折半,再丢进去

go写法

go如果想用heap,要实现less\len\swap\push\pop
但可以偷懒,用sort.IntSlice,已经实现了less\len\swap
但由于目前是大根堆,要重写一下less
因此,优先队列的自定义则为

// heap对应的interface要实现less\len\swap\push\pop
// 但intslice已经实现less\len\swap,但less要重写
type PriorityQueue struct {
    sort.IntSlice
}

func(pq *PriorityQueue) Less(i, j int) bool {
    return pq.IntSlice[i] > pq.IntSlice[j] // 大根堆
}

func(pq *PriorityQueue) Push(v interface{}) {
    pq.IntSlice = append(pq.IntSlice, v.(int)) // interface转int
}

func (pq *PriorityQueue) Pop() interface{} {
    arr := pq.IntSlice
    v := arr[len(arr) - 1]
    pq.IntSlice = arr[:len(arr) - 1]
    return v
}

ac code

// heap对应的interface要实现less\len\swap\push\pop
// 但intslice已经实现less\len\swap,但less要重写
type PriorityQueue struct {
    sort.IntSlice
}

func(pq *PriorityQueue) Less(i, j int) bool {
    return pq.IntSlice[i] > pq.IntSlice[j] // 大根堆
}

func(pq *PriorityQueue) Push(v interface{}) {
    pq.IntSlice = append(pq.IntSlice, v.(int)) // interface转int
}

func (pq *PriorityQueue) Pop() interface{} {
    arr := pq.IntSlice
    v := arr[len(arr) - 1]
    pq.IntSlice = arr[:len(arr) - 1]
    return v
}


func minStoneSum(piles []int, k int) int {
    pq := &PriorityQueue{piles} // 传引用,方便修改
    heap.Init(pq)
    for i := 0; i < k; i++ {
        pile := heap.Pop(pq).(int)
        pile -= pile / 2
        heap.Push(pq, pile)
    }
    sum := 0
    for len(pq.IntSlice) > 0 {
        sum += heap.Pop(pq).(int)
    }
    return sum
}

总结

注意pq自定义的时候要传引用,这样才能完成修改,而并非复制
注意interface()和基本数据类型的转换.(int)

相关文章:

  • 微信小程序生成一个天气查询的小程序
  • 用23种设计模式打造一个cocos creator的游戏框架----(二十二)原型模式
  • 音视频的编码格式与封装格式
  • mysql 数据编译安装以及参数说明 安装包下载
  • OpenCV利用HSV颜色区间分离不同物体
  • linux开发板树莓派下载vnc远程桌面
  • 前菜---二叉树+堆的小练习
  • 手写单链表(指针)(next域)附图
  • docker资源限制
  • 【matlab】Matlab三维绘图指南
  • 使用Python实现发送Email电子邮件【第19篇—python发邮件】
  • SolidWorks中的InsertCombineFeature
  • 【C++进阶02】多态
  • Go 泛型之类型参数
  • PyTorch之线性回归
  • 第1课 配置FFmpeg+OpenCV开发环境
  • Kioptrix-3
  • 08 2024考研408-数据结构 第八章-排序学习笔记
  • 【51单片机系列】C51中的中断系统扩展实验
  • Linux ContOS7 日志管理(rsyslog)
  • 纪录片《中国》原班人马打造,《船山先生》美学再升级
  • 美联储主席:关税“远超预期”,美联储实现目标的进程或被推迟至明年
  • 长安汽车辟谣作为二级企业并入东风集团:将追究相关方责任
  • 秦洪看盘|受阻回落,蓄积新做多能量
  • 哈马斯官员:进一步停火谈判毫无意义
  • 贵州黔西市游船倾覆事故最后一名失联人员被找到,但已无生命体征