数据结构 —堆

news/2025/1/15 18:03:54/文章来源:https://www.cnblogs.com/gsupl/p/18401981

一:堆

1、一种二叉树的结构(完全二叉树)

2、完全二叉树:从上到下;从左到右;填满

3、最大堆:根节点的权值大于孩子节点

4、最小堆:根节点的权值依次小于孩子节点

5、常用操作

import heapq# 创建最小堆和最大堆
min_heap = []
max_heap = []# 插入元素
heapq.heappush(min_heap, 10)
heapq.heappush(min_heap, 1)
heapq.heappush(min_heap, 5)heapq.heappush(max_heap, -10)
heapq.heappush(max_heap, -1)
heapq.heappush(max_heap, -5)# 获取并删除堆顶元素
print("最小堆堆顶元素(删除后):", heapq.heappop(min_heap))  # 输出: 1
print("最大堆堆顶元素(删除后):", -heapq.heappop(max_heap))  # 输出: 10# 获取堆大小
print("最小堆大小:", len(min_heap))  # 输出: 2
print("最大堆大小:", len(max_heap))  # 输出: 2# 合并堆(注意:这不会修改原来的堆)
merged_heap = list(heapq.merge(min_heap, [-x for x in max_heap]))
print("合并后的堆:", merged_heap)  # 输出: [-10, -5, -1, 5, 10]# 堆排序(从最小到最大)
sorted_min_heap = []
while min_heap:sorted_min_heap.append(heapq.heappop(min_heap))sorted_max_heap = []
while max_heap:sorted_max_heap.append(-heapq.heappop(max_heap))print("最小堆排序后的元素:", sorted_min_heap)  # 输出: [5, 10]
print("最大堆排序后的元素:", sorted_max_heap)  # 输出: [5, 1]#遍历堆# 最小堆
for i in range(len(min_heap)):print(min_heap[i])# 最大堆
for i in range(len(max_heap)):print(-max_heap[i])

二:刷题

215 数组中的第K个最大元素

(1)思路:python默认仅支持最小堆;如果要使用最大堆的话可以进行取反;最后返回目标值的相反数就可以解决这个问题

(2)实现:先将数组进行取反操作;然后使用heapq.heapify将数组转换为最小堆;然后根据题目要求遍历取出目标值(本题需要取出第K大个元素;所有直接使用heapq.heappop(nums)结合循环取出第K大个元素)

#方法1 数组
def func(nums,k):nums.sort()return nums[-k]
nums=[3,2,3,1,2,4,5,5,6]
k = 4
print(func(nums,k))
#方法2 最大堆
import heapq
class Solution:def findKthLargest(self, nums, k: int) -> int:nums=[-num for num in nums]heapq.heapify(nums)#构建最大堆;因为python中默认为最小堆for i in range(k):lastmax=heapq.heappop(nums)return -lastmax

414 第三大的数

(1)与上面题目不相同的就是多了一个小tips;当数组的长度不够目标值的长度的时候直接返回当前数组最大的元素即可;其余一致(第3大的元素就是弹出索引为0,1,2的元素即可;直接使用range(3))

class Solution:def thirdMax(self, nums: List[int]) -> int:nums=list(set(nums))if len(nums)<3:return max(nums)nums=[-num for num in nums]heapq.heapify(nums)for i in range(3):lastmax=heapq.heappop(nums)return -lastmax

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

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

相关文章

软工第一次作业-论文查重

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业的目标 通过Java开发个人项目,实现项目单元测试作业github地址(含jar包) github:https://github.com/…

第二十讲:为什么我只改一行的语句,锁这么多?

该文章深刻揭示了一点:加索引=行锁+间隙锁=(next-key lock),分析了加锁的规则:对主键(唯一索引),普通非唯一索引进行等值与范围查询的加锁。这篇文章我认为收获最大的是让我们知道“明明对一行加了锁,为什么在他相邻部分,或是相相邻部分无法插入数据(这根主键类型,…

【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例

原文链接:https://tecdat.cn/?p=37702 原文出处:拓端数据部落公众号 分析师:Dongzhi Zhang 近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本…

Docker-Compose搭建RustDesk服务器

前置条件:电脑安装RustDesk客户端,服务器安装Docker及docker-compose官方文档:安装 :: RustDesk文档操作流程:使用Vim编写docker-compose.yml文件,修改需要的端口,最好按照官方对应的端口来操作,< >内替换成服务器对外的端口。记住挂载文件路径,容器运行后会生成密…

CMake构建学习笔记16-使用VS进行CMake项目的开发

详细介绍了通过Visual Studio 2019 这款IDE进行CMake项目开发过程,能够极大增加C/C++程序的开发效率。目录1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行3. 项目案例4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…

USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)

1.概述 RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器。USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0。USB3.0 DRD控制器的内部结构如下图所示;总线接口为AXI或AHB;USB3.0和USB2.0及USB1.0硬件上独立;USB3.0控制器数字逻辑部分对应SS MAC,…

作业2:个人项目

个人项目-论文查重 一、课程信息这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 熟悉软件开发以及工具的使用、算法的设计、资料的搜集GitHub地址 二、开发环境开发工具 IDEA 2021.3.2项目构建工具 maven单元测试 Junit分词依赖包 hanlp三、…

Linkedin-SRE-中文教程-二-

Linkedin SRE 中文教程(二)原文:School of SRE 协议:CC BY-NC-SA 4.0一些 Python 概念原文:https://linkedin.github.io/school-of-sre/level101/python_web/python-concepts/虽然期望您了解 python 及其基本语法,但是让我们讨论一些基本概念,这将帮助您更好地理解 pyth…

分析负数取模与取余的规则

目录负数"取模"基本概念修正定义取整规则决定商的值取模和取余不一样. 负数"取模"基本概念如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r,且0 <= r < d。其中,q 被称为商,r 被称为余数。 //对应代码 int mai…

Openwrt挂载大容量NTFS磁盘,解决默认挂载不能写入问题,实现samba共享

1. 目的 在OpenWRT上挂载上大容量磁盘(NTFS文件系统),支持读写操作。解决默认挂载仅能读取,不能写入问题。 配置Samba36,实现局域网文件夹共享。 2. 环境架构 ARMv7 Processor rev 1 (v7l)固件版本 OpenWrt 19.07.7内核版本 3.10.33安装插件smbd -v # 检查是否安装了smb …

使用MySQL Workbench进行数据库备份

1、打开MySQL Workbench2、进行数据库连接配置 如果之前连过,会有历史记录,直接点击需要备份的连接即可3、进入主界面后,选择左侧的Administration选项卡,然后点击Data Export;或者点击工具栏的Server——Data Export4、选择要备份的数据库,默认选择所有的表,在objects …

Mininet安装记录

安装环境: Ubuntu虚拟机版本:14.04 Mininet版本:2.3.1b1 1、更改软件镜像源 在设置中进行如下操作:选择国内的镜像站点,如阿里云。 点击关闭后,在弹出的窗口中点击重新载入,等待缓存更新完成。2、下载git 在终端中执行如下命令: sudo apt-get install git没有报错的话,…