跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题leetcode215数组中的第K个最大元素

这个题,用堆来做是很容易想到的。好久没写堆了,记得温故知新啊啊啊。
来看看堆的基本操作先:

定义了以下函数:

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)

好了。

猜你喜欢

转载自blog.csdn.net/mianjiong2855/article/details/107443716