go语言 最小堆 最大堆 堆排序

news2025/2/24 8:36:20

建堆
调整
删除
先根据数组构建完全二叉树
在这里插入图片描述
从第一个非叶结点开始 调整为大跟堆,这里就是图里面的1结点开始调整

代码如下:

func findKthLargest(nums []int, k int) int {

    heapSize := len(nums)
    buildMaxHeap(nums,heapSize)
    for i := len(nums) - 1; i >= len(nums) - k + 1; i-- {
        //堆顶出列 堆低补上
        nums[0], nums[i] = nums[i], nums[0]
        heapSize--
        maxHeapify(nums,0,heapSize)
    }

    return nums[0]
}
func buildMaxHeap(a []int, heapSize int) {

    //初始化大根堆
    //非叶结点都堆排序一次 排序方式从尾到头
    for i := heapSize / 2; i >= 0; i-- {
        maxHeapify(a,i,heapSize)
    }
}
// 大跟堆的调整
// 传入一个非叶结点
func maxHeapify(a []int, i ,heapSize int) {
    l := i*2 + 1
    r := i*2 + 2
    largest := i

    if l < heapSize && a[l] > a[largest] {
        largest = l
    }
    if r < heapSize && a[r] > a[largest] {
        largest = r
    }

    if largest != i {
        a[i], a[largest] = a[largest], a[i]
        //交换后的元素需要继续堆化
        maxHeapify(a,largest,heapSize)
    }
}

以此类推 运用上一个模板来再写一题
前K个高频元素

func topKFrequent(nums []int, k int) []int {
    
    
    res := []int{}

    hash := map[int]int{}

    for i := range nums {
        hash[nums[i]]++
    }

    //创建新数组
    new := []int{}

    for key := range hash {
        new = append(new,key)
    }
    heapSize := len(new)
    buildHeap(new, heapSize, hash)

    for i := len(new) - 1; i >= len(new) - k; i-- {
        res = append(res,new[0])
        new[0], new[i] = new[i], new[0]
        heapSize--
        heapify(new,0,heapSize, hash)
    }

    return res
}
func buildHeap(a []int, heapSize int, hash map[int]int) {

    for i := heapSize / 2; i >= 0; i-- {
        heapify(a,i,heapSize, hash)
    }
}

func heapify(a []int, i int, heapSize int, hash map[int]int) {
    l := i*2 + 1
    r := i*2 + 2
    largest := i

    if l < heapSize && hash[a[l]] > hash[a[largest]] {
        largest = l
    }
    if r < heapSize && hash[a[r]] > hash[a[largest]] {
        largest = r
    }

    if largest != i {
        a[i], a[largest] = a[largest], a[i]
        heapify(a,largest,heapSize, hash)
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - BINOM.DIST函数

描述 BINOM.DIST函数返回单个项二项式分布概率。 在具有固定数量的测试或试验的问题中使用BINOM.DIST。 当任何试验的输出只是成功或失败时 试验是独立的,并且 在整个实验中成功的概率不变的情况 语法 BINOM.DIST (number_s,trials,probability_s,cumulative)争论 Argu…

选择护眼台灯的标准?专家推荐台灯好物分享

自从护眼台灯成为学生书桌上最常见的照明灯具后&#xff0c;就经常能看到关于护眼台灯伤眼的信息。从根源上说&#xff0c;是各种不专业产品混杂在市场中&#xff0c;这种产品技术较差&#xff0c;而且为减少成本选择品质差的材料&#xff0c;但由于低廉的价格仍然吸引了众多消…

【FAQ】以服务方式启动安防监控系统EasyNVR程序,出现播放异常的原因排查与解决

EasyNVR安防视频监控平台的特点是基于RTSP/Onvif协议&#xff0c;将前端设备统一接入&#xff0c;在平台进行转码、直播、处理及分发&#xff0c;在智慧安防视频监控场景中&#xff0c;EasyNVR可实现实时监控、云端录像、检索与回放、云存储、告警、级联等视频能力&#xff0c;…

Redis缓存设计与性能优化最佳实践

开发规范与性能优化 一、键值设计 1. key名设计 (1)【建议】: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突)&#xff0c;用冒号分隔&#xff0c;比如业务名:表名:id (2)【建议】&#xff1a;简洁性 保证语义的前提下&#xff0c;控制key的长度&#xff0c;…

备考新境界:考研竞争中的超级助推器,让AIGC点亮你的学术之路!

近年来&#xff0c;各院校毕业生逐年增长、就业压力提升&#xff0c;研究生学历在就业市场上占有明显优势。加上留学、考公、二战等多赛道的涌入&#xff0c;硕士研究生报名人数呈现快速上升趋势。根据调查显示&#xff0c;2023年考研报考人数达457万人&#xff0c;报录比甚至达…

面向组织分析的内容

声明 本文是学习GB-T 42859-2023 航天产品质量问题三个面向分析方法实施要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了航天产品质量问题三个面向分析方法实施的一般要求、程序和分析内容。 本文件适用于承担航天产品研制…

IntelliJ IDEA快速查询maven依赖关系

1.在Maven窗口中点击Dependencies->show Dependencies 2.得到依赖关系图 此时原有快捷键Ctrlf可以查询jar包&#xff0c;如果没有查询菜单出来则设置快捷键方式为 File->Settings->Keymap->搜索栏输入find->在Main Menu下Edit下Find下Find双击算则Add keyboard…

月木学途开发 2.前台用户模块

概述 效果展 数据库设计 会员表 DROP TABLE IF EXISTS user_type; CREATE TABLE user_type (userTypeId int(11) NOT NULL AUTO_INCREMENT,userTypeName varchar(255) DEFAULT NULL,userTypeDesc varchar(255) DEFAULT NULL,PRIMARY KEY (userTypeId) ) ENGINEInnoDB AUTO_I…

VLAN的配置实例

基于端口的vlan划分 以下配置为例&#xff1a; 注意选择copper线&#xff0c;可以任意选择端口 PC配置如下&#xff1a; LSW1配置如下 [LSW1]vlan 10 [LSW1-vlan10]qu [LSW1]interface g0/0/9 [LSW1-Gigabitethernet0/0/9] port link-type acces [LSW1-Gigabitethernet0/0/9]…

Python 公里与海里换算

""" 公里与海里换算知识点&#xff1a;1、换算公式&#xff1a;海里 公里 / 1.8522、input()、print()函数3、变量类型转换&#xff0c;整形int与字符串str转换&#xff0c;可以用type()函数验证4、字符串拼接&#xff0c;例如&#xff1a;123 456 1234565、…

盘点数字人源头厂商哪家公司OEM定制能力好!

在当今的科技盛世&#xff0c;我们与数字人的互动越来越频繁。无论是在工作中的智能助手&#xff0c;还是数字人播&#xff0c;数字员工&#xff0c;还是在生活中的个性化推荐&#xff0c;数字人都在为我们的生活增添色彩。然而&#xff0c;大家可能并未意识到&#xff0c;这些…

JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合

目录 实现思路 相关技术的解析 ​编辑会话跟踪三个方案 JWT令牌技术 ​生成令牌 校验令牌 登录下发令牌 实现思路 通过登录成功的标记来检测,在每个接口前做一个标记判断是否登录,若没登录则返回错误信息,并使前端退出.但这样较为繁琐,因此我们可以通过一种统一拦截的技…

预处理代码

一、缺失值处理 删除缺失值&#xff1a; data1data.dropna()#丢弃缺失值 #dropna()删除缺失值所在行(axis0)或列(axis1)&#xff0c;默认为 axis0 补全 示例数据&#xff1a; import pandas as pd import numpy as npdata pd.DataFrame({name: [Bob, Mary, Peter, np.nan, L…

【python爬虫】—星巴克产品

文章目录 需求爬取星巴克产品以及图片&#xff0c;星巴克菜单 python爬虫爬取结果 需求 爬取星巴克产品以及图片&#xff0c;星巴克菜单 网页分析&#xff1a; 首先&#xff0c;需要分析星巴克官方网站的结构&#xff0c;了解菜单栏的位置、布局以及菜单项的标签或类名等信息…

计算最大回撤

计算最大回撤 1. 累积计算统计特征函数 PANDAS库中累积计算统计特征函数&#xff1a; 1、CUMSUM() 依次给出前1&#xff0c;2&#xff0c;…&#xff0c;n个数的和 2、CUMPROD() 依次给出前1&#xff0c;2&#xff0c;…&#xff0c;n个数的积 3、CUMMAX() 依次给出前1&#…

腾讯云16核服务器配置大全_16核CPU型号性能测评

腾讯云16核CPU服务器有哪些配置可以选择&#xff1f;可以选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xf…

6.8-SpringIoC之循环依赖底层源码解析

解决靠&#xff0c;三级缓存 创建Map&#xff0c;存不完整的Bean 存在问题&#xff1a;属性存在但没有值

Redis——Java客户端配置

概要 由于Redis服务器在官网公开了RESP协议&#xff0c;因此第三方可以通过这个协议来实现和Redis服务器通信的客户端程序&#xff0c;而具体的通信逻辑也不需要我们去实现&#xff0c;只需要导入大佬的库即可 jedis就是封装了RESP协议&#xff0c;提供了一组api供我们使用 …

Python进阶学习----一闭三器

目录 ​编辑 前言 一.三器 1. 迭代器&#xff08;Iterator&#xff09; 1.1 什么是可迭代对象 1.2什么是迭代器 1.3案例演示&#xff1a; 以下是一个简单的迭代器示例&#xff0c;遍历一个列表并打印每个元素&#xff1a; 1.4迭代器总结 2. 生成器&#xff08;Generat…

自动化测试的类型​以及自动化测试的几个误区!

有三种主要类型的自动化测试。 一、自动化单元测试​编辑 自动化单元测试在代码级别上进行测试。bug是在开发人 员编写的函数、方法和例程中识别出来的。 一些公司要求开发人员自己进行单元测试&#xff0c;而有些公司则雇用专门的测试自动化资源。这些资源可以访问源代码&a…