数据结构 —堆

news/2024/9/23 7:21:40

一:堆

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.ryyt.cn/news/60490.html

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

相关文章

CodeForces VP Record

CodeForces Round 767 (contest 1628) A Meximum Array 考虑二分。二分的时候计算区间 $ \text{mex} $,参考 P4137 Rmq Problem / mex,主席树即可。时间复杂度 $ \Theta(n \log^2 n) $,无需卡常。 B Peculiar Movie Preferences 首先,对于一个合法的回文串,容易证明首尾两…

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

这个作业属于哪个课程 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/…

文本相似度计算

一、PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 30 35 Estimate估计这个任务需要多少时间 30 35Development 开发 400 450 Analysis需求分析 (包括学习新技术) 60 70 Design Spec生成设计文档 60 60 Design Review…

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

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

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

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

Docker-Compose搭建RustDesk服务器

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

[安洵杯 2019]easy_web

首先抓包可以看到img是一个base64编码依次经过base64,base64,asciihex解码得到一个图片名555.png那么我们可以利用这一点反过去看index.php的源码,修改头 img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3 最后经过base64解码后 <?php error_reporting(E_ALL || ~ E_NOTICE); header…

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. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…