这个题,用堆来做是很容易想到的。好久没写堆了,记得温故知新啊啊啊。
来看看堆的基本操作先:
定义了以下函数:
heapq.heappush(heap, item)
将 item 的值加入 heap 中,保持堆的不变性。
heapq.heappop(heap)
弹出并返回 heap 的最小的元素,保持堆的不变性。
如果堆为空,抛出 IndexError 。使用 heap[0] ,可以只访问最小的元素而不弹出它。
heapq.heappushpop(heap, item)
将 item 放入堆中,然后弹出并返回 heap 的最小元素。
该组合操作比先调用 heappush() 再调用 heappop() 运行起来更有效率。
heapq.heapify(x)
将list x 转换成堆,原地,线性时间内。
heapq.heapreplace(heap, item)
弹出并返回 heap 中最小的一项,同时推入新的 item。
堆的大小不变。 如果堆为空则引发 IndexError。
这个单步骤操作比 heappop() 加 heappush() 更高效,并且在使用固定大小的堆时更为适宜。
pop/push 组合总是会从堆中返回一个元素并将其替换为 item。
返回的值可能会比添加的 item 更大。 如果不希望如此,可考虑改用 heappushpop()。
它的 push/pop 组合会返回两个值中较小的一个,将较大的值留在堆中。
好了,题:
215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
第k个最大元素,维护堆的大小为k,不断的pop出小的数值。
code:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
knum = []
for num in nums:
heapq.heappush(knum, num)
while len(knum) > k:
heapq.heappop(knum)
return heapq.heappop(knum)
好了。