📜  数据结构|堆|问题9(1)

📅  最后修改于: 2023-12-03 15:26:09.438000             🧑  作者: Mango

数据结构 | 堆 | 问题9

在计算机科学中,(英语: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 小的元素。这是因为小根堆的堆顶元素是最小元素,每次弹出堆顶元素之后,堆中剩余元素中的最小元素就会上移到堆顶。而大根堆的堆顶元素是最大元素,因此每次弹出堆顶元素之后,堆中剩余元素中最大的元素就会上移到堆顶。