当前位置: 首页 > 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)

http://www.dtcms.com/a/5690.html

相关文章:

  • 微信小程序生成一个天气查询的小程序
  • 用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)
  • Ubuntu 常用命令之 chown 命令用法介绍
  • STM32的以太网外设+PHY(LAN8720)使用详解(7):以太网数据接收及发送测试
  • ChatGPT4与ArcGIS Pro3助力AI 地理空间分析和可视化及助力科研论文写作
  • 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数
  • MFC窗体背景颜色的设置、控件白色背景问题、控件文本显示重叠问题、被父窗体背景覆盖的问题
  • myspl左外连
  • Amazon Toolkit — CodeWhisperer 使用
  • 【Linux】进程周边007之进程控制
  • 麒麟V10 ARM 离线生成RabbitMQ docker镜像并上传Harbor私有仓库
  • Oracle的学习心得和知识总结(三十一)| ODBC开放式数据库连接概述及应用程序开发