📜  流中第 K 个最大的元素(1)

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

流中第 K 个最大的元素

当涉及到流和元素的问题时,我们可以使用堆(Heap)数据结构来解决。堆是一种用来实现优先队列(Priority Queue)的数据结构,因为它可以在 $O(logn)$ 的时间内插入元素和删除最小/最大(取决于是最小堆还是最大堆)元素。

对于查找流中第 K 个最大的元素,我们可以使用最小堆(Min Heap)。在最小堆中,元素按照它们的大小排列,但是根节点是最小的元素。因此,我们可以在堆中维护前 K 个最大的元素,并将其余元素插入堆中。当插入一个新元素的时候,如果堆中元素的数量大于 K,则删除堆顶元素。

现在我们来看看代码吧。

import heapq

def findKthLargest(nums, k):
    # 最小堆,取反操作,因为Python heapq 默认为最小堆
    heap = [-num for num in nums[:k]]
    heapq.heapify(heap)
    n = len(nums)
    for i in range(k, n):
        if -nums[i] > heap[0]: # 最小堆堆顶元素即为堆中最小元素,与nums[i]比较
            heapq.heappop(heap)
            heapq.heappush(heap, -nums[i])
    return -heap[0]

接下来让我们看看这个算法的时间复杂度。因为在刚开始中,我们需要将前 K 个元素添加到堆中,花费 $O(K)$,最大的时间复杂度是 $O(nlogK)$,其中 n 是输入数组中的元素数量。这个时间复杂度非常好的解决了我们的问题。

希望本文对您对解决流中第 K 个最大的元素问题有所帮助。