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

📅  最后修改于: 2023-12-03 14:54:56.705000             🧑  作者: Mango

数据结构 | 堆 | 问题7
问题描述

给定一个数组,找到第 k 大的元素。例如,

Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
解决方案

一种可行的解决方案是使用一个最小堆。首先,将前 k 个元素插入最小堆中。然后,从第 k+1 个元素开始,将每个元素和堆的顶部进行比较。如果该元素大于堆的顶部,则将堆的顶部弹出并将该元素插入堆中。最终,第 k 大的元素就是堆顶部的元素。

代码如下所示:

import heapq

def find_kth_largest(nums, k):
    heap = nums[:k]
    heapq.heapify(heap)

    for i in range(k, len(nums)):
        if nums[i] > heap[0]:
            heapq.heappop(heap)
            heapq.heappush(heap, nums[i])

    return heap[0]
复杂度分析
  • 时间复杂度: $O(nlogk)$,其中 n 是数组的长度。由于建立大小为 k 的堆的时间复杂度为 O(k),对于剩余的 n-k 个元素,每次堆化的时间复杂度为 O(logk),因此总时间复杂度为 O(k + (n - k)logk) = O(nlogk)。

  • 空间复杂度:O(k),需要维护一个大小为 k 的堆。