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.IntSlicev := 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.IntSlicev := 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 / 2heap.Push(pq, pile)}sum := 0for len(pq.IntSlice) > 0 {sum += heap.Pop(pq).(int)}return sum
}

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297153.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CFA II 考试公式大全 (WILEY’S CFA PROGRAM LEVEL II)

WILEY’S CFA PROGRAM LEVEL II quicksheet, quantitative 和 economics部分 网址&#xff1a;http://deepnlp.org/blog/cfa-ii-quantitative-economics 公式目录: 1.QUANTITATIVE METHODS 1.1 LINEAR REGRESSION-Standard Error of the Estimate LINEAR REGRESSION-Predict…

unity脚本API中OnCollisionEnter()、OnTriggerEnter()二者的区别

Unity中的OnCollisionEnter和OnTriggerEnter两个函数在日常的开发中很常见但也容易混淆&#xff0c;下面说一说两者的区别。 碰撞器&#xff08;Collider&#xff09;与触发器&#xff08;Trigger&#xff09;的概念 碰撞器&#xff08;Collider&#xff09;和触发器&#xff…

进行鸿蒙开发前的一些工具了解

文章概叙 文章主要讲的是开发的一些工具&#xff0c;如DevEco Studio,以及ArkTs的一些基础。 为啥要学习鸿蒙开发 抛开各种遥遥领先不讲&#xff0c;现在打开BOSS直聘&#xff0c;已经可以看到在BOSS上有不少的岗位是关于鸿蒙的&#xff0c;甚至是华为的岗位&#xff0c;而在…

simulink代码生成(二)——ADC采样模块

这一节梳理如何使用C2000库中的ADC模块&#xff0c;从而实现采样&#xff1b; 先预留几个问题&#xff0c;逐步进行解决。 &#xff08;1&#xff09;在simulink中C2000的ADC采样模块设置是怎么样的&#xff1f;各个选项卡代表什么&#xff1f; &#xff08;2&#xff09;AD…

相机内参标定理论篇------张正友标定法

一、为什么做相机标定&#xff1f; 标定是为了得到相机坐标系下的点和图像像素点的映射关系&#xff0c;为摄影几何、计算机视觉等应用做准备。 二、为什么需要张正友标定法&#xff1f; 张正友标定法使手工标定相机成为可能&#xff0c;使相机标定不再需要精密的设备帮助。…

婚庆婚礼策划服务网站建设的效果如何

品牌效应越来越重要&#xff0c;婚庆行业在多年的发展下&#xff0c;部分区域内也跑出了头部品牌&#xff0c;连锁门店也开了很多家&#xff0c;无论新品牌还是老品牌在新的区域开店总归少不了线上线下的宣传&#xff0c;虽然几乎每个人都会接触婚庆服务&#xff0c;但因为市场…

编译原理--词法分析C++

一、实验项目要求 1.实验目的 通过设计编制调试一个具体的词法分析程序&#xff0c;加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程&#xff0c;从输入的源程序中&#xff0c;识别出各个具有…

华为交换机Telnet原理与配置

Telnet远程连接到每一台设备上&#xff0c;对这些网络设备进行集中的管理和维护。 Telnet应用场景 Telnet可以通过终端对本地和远程的网络设备进行集中管理。Telnet提供了一个交互式操作界面&#xff0c;允许终端远程登录到任何可以充当Telnet服务器的设备。Telnet用户可以像通…

指针与数组

&#xff08;1&#xff09;在C语言中&#xff0c;数组的指针是指数组在内存中的起始地址&#xff0c;数组元素的地址是指指数组元素在内存中的起始地址 &#xff08;2&#xff09;一维数组的数组名为一维数组的指针&#xff08;其实地址&#xff09; 设指针变量px的地址值等于…

ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料

原文链接SDFormat extensions to URDF (the gazebo tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了&#xff1a; Toggle navigation SpecificationAPIDocumentationDownload Back Edit Version: 1.6 Table of C…

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

Chainlink 开发者故事:Krypton 从构思到产品的 Chainlink BUILD之旅

识别问题&#xff0c;构思解决方案&#xff0c;建立它&#xff0c;推出它&#xff0c;然后扩展它。这就是科技初创企业的操作手册。 现在&#xff0c;前Chainlink黑客马拉松获奖者&#xff0c;当前的Chainlink BUILD成员Krypton已经进行到了第四步&#xff1a;推出。Krypton团…