#215
Medium
堆 / 优先队列

Kth Largest Element in an Array

在无序数组中找出第 k 大元素。

ArrayHeap

题目定位

维护一个大小为 k 的小根堆,就等于维护了当前 top-k 前沿,而堆顶天然就是第 k 大元素。

关键观察

你并不需要完整排序,只需要记住目前见过的前 k 大元素。

目标复杂度

O(n log k) / O(k)

这题的解法思路怎么拆

1

维护一个大小为 k 的小根堆,就等于维护了当前 top-k 前沿,而堆顶天然就是第 k 大元素。

2

你并不需要完整排序,只需要记住目前见过的前 k 大元素。

3

先用一句话说明堆顶代表什么。

4

新候选者一旦合格就立刻入堆。

参考实现

Python
# Generic pattern template
import heapq

heap = []
heapq.heappush(heap, value)
smallest = heapq.heappop(heap)

# max heap in Python
heapq.heappush(heap, -value)
largest = -heapq.heappop(heap)

常见坑点

warning

明明小根堆维护 k 个元素更自然,却写成大根堆弹 k 次。

warning

堆大小超过 k 还不及时修正。

高频追问

和 quickselect 相比,这种方法优劣如何?

为什么堆顶是第 k 大,而不是最大值?

继续刷相关题

先把 堆 / 优先队列 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 215. Kth Largest Element in an Array 题解思路 | Interview AiBox