📅  最后修改于: 2023-12-03 15:26:09.438000             🧑  作者: Mango
在计算机科学中,堆(英语:Heap)是一类经过特殊优化的树形数据结构,能够高效、快速地寻找到其中最大值或最小值。
在一些场景中,我们需要维护一个有序序列,并且频繁地对它进行插入、删除操作。这时候可以考虑使用堆来实现。
单个元素的插入操作的时间复杂度是 O(log n),与树的深度相关,即堆的高度。对于 n 个元素,建堆的时间复杂度为 O(n),因此平均每个元素的插入时间复杂度是 O(log n)。而查找最小/大元素可以在 O(1) 的时间内实现。
给定一个数组 nums
和一个整数 k
,返回数组中第 k
个最大的元素。
例如:
nums = [3,2,1,5,6,4]
k = 2
应该返回 5
,因为它是第二个最大的元素。
我们可以使用一个大小为 k 的小根堆。遍历数组,依次将元素添加到堆中。当堆的大小超过 k 时,弹出堆顶元素,保证堆中始终只有 k 个元素,且其中最小的元素位于堆顶。
最后返回堆顶元素即可。
下面是使用 Python 语言实现的代码:
import heapq
from typing import List
def findKthLargest(nums: List[int], k: int) -> int:
heap = []
for num in nums:
heapq.heappush(heap, num)
if len(heap) > k:
heapq.heappop(heap)
return heap[0]
这个算法的时间复杂度是 O(n log k),其中 n 是数组的长度。由于堆的大小不超过 k,所以空间复杂度是 O(k)。
这篇文章介绍了堆这种数据结构,以及如何使用堆解决需要维护有序序列的问题。并且给出了一个具体的例子:如何在一个数组中查找第 k 大的元素。
需要注意的一点是,小根堆适合用于查找第 k 大的元素,而大根堆适合用于查找第 k 小的元素。这是因为小根堆的堆顶元素是最小元素,每次弹出堆顶元素之后,堆中剩余元素中的最小元素就会上移到堆顶。而大根堆的堆顶元素是最大元素,因此每次弹出堆顶元素之后,堆中剩余元素中最大的元素就会上移到堆顶。