📌  相关文章
📜  教资会网络 | UGC NET CS 2015 年 6 月 – III |问题 17(1)

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

教资会网络 | UGC NET CS 2015 年 6 月 – III |问题 17

题目描述

给定一个长度为n的数组arr,请写一个程序,找到arr中第k大的元素。例如,如果arr=[10, 20, 30, 40, 50],其中k = 3,那么输出就是30。

解题思路

这道题可以用排序或者堆来解决,但是排序的时间复杂度是O(nlogn),而堆的时间复杂度是O(nlogk)。因此,我们选择用最小堆来解决这个问题。

我们可以维护一个大小为k的最小堆,遍历数组中的每一个元素,如果当前元素大于堆的最小值,那么就将堆的最小值替换成当前元素。这样的话,最后堆中第k大的元素就是堆的最小值。

代码实现
import heapq
def kth_largest(arr, k):
    heap = []
    for i in arr:
        if len(heap) < k:
            heapq.heappush(heap, i)
        else:
            if heap[0] < i:
                heapq.heappop(heap)
                heapq.heappush(heap, i)
    return heap[0]
测试样例
>>> arr = [10, 20, 30, 40, 50]
>>> k = 3
>>> print(kth_largest(arr, k))
30

>>> arr = [10, 20, 15, 31, 5, 60, 40]
>>> k = 4
>>> print(kth_largest(arr, k))
31