📅  最后修改于: 2023-12-03 15:39:54.378000             🧑  作者: Mango
给定一个长度为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