数据结构 —堆
一:堆
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
作者:
Shu-How Z
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。