本文参考了Python的官方文档,主要是对常用方法进行分析,并对注意事项进行记录
heapq - 堆队列算法
这是python自带的库函数,实际上是最小堆,使用列表实现,堆顶元素为列表的第一个元素(最小元素)
从零开始计数,对于所有的 k
,都有 heap[k] <= heap[2*k+1]
和 heap[k] <= heap[2*k+2]
。 为了便于比较,不存在的元素被认为是无限大。 最小的元素总是在根结点:heap[0]
函数
heap = []
heapq.heappush(heap, item)
- 将
item
的值加入heap
中,保持堆的不变性。
- 将
heapq.heappop(heap)
- 弹出并返回
heap
的最小的元素,保持堆的不变性。如果堆为空,抛出IndexError
。 - 使用
heap[0]
,可以只访问最小的元素而不弹出它。
- 弹出并返回
heapq.heappushpop(heap, item)
- 这个函数是先推入再弹出
- 将
item
放入堆中,然后弹出并返回heap
的最小元素。 - 保证堆大小不变
- 该组合操作比先调用
heappush()
再调用heappop()
运行起来更有效率。
heapq.heapreplace(heap, item)
- 这个函数是先弹出再推入,返回的值可能会比添加的 item 更大
- 弹出并返回
heap
中最小的一项,同时推入新的item
。 堆的大小不变。 如果堆为空则引发 IndexError。 - 比 heappop() 加 heappush() 更高效,并且在使用固定大小的堆时更为适宜。 pop/push 组合总是会从堆中返回一个元素并将其替换为 item。
heapq.heapify(x)
- 将 list
x
转换成堆,原地,线性时间内。
- 将 list
heapq.nlargest(n, iterable, key=None)
- 从 iterable 所定义的数据集中返回前 n 个最大元素组成的列表。
heapq.nsmallest(n, iterable, key=None)
- 从 iterable 所定义的数据集中返回前 n 个最小元素组成的列表。
Leetcode 215
数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
if k > len(nums):
raise Exception("Error")
L = []
for i in range(k):
heapq.heappush(L, nums[i])
for i in range(k, len(nums)):
if L[0] < nums[i]:
heapq.heappushpop(L, nums[i])
return L[0]