Python 返回数据流中的第k大元素 LeetCode NO.703
思路:
- 在理解这个题目的时候,首先大家要理解,heap的概念,也就是堆是什么(在这里简单的说下,一般而言我们说的堆都是树的结构,分为最大堆和最小堆,也就是堆顶的元素是是最大值还是最小值区分的。但是不只是树来实现的,还有二项式堆,斐波拉契堆,大家可以维基百科一下,各种操作的时间复杂度)。并且一般的高级语言中,都会实现heap这样的数据结构。python中的heap的包在这里,一些基本操作和例子可以看一下
- 正式讲解思路,有了heap这样的结构就很好办来,首先可以从这个list当中找到前k大的值,然后把这k个值,组成一个最小堆,那个这个堆顶的元素,就是第k大的数。重点是,在进行添加的过程中还要找到第k大的值才是关键。当添加元素的时候,我们只需要维护这样一个小顶堆就可以了。具体看代码
import heapq
class KthLargest(object):
def __init__(self, k, nums):
"""
:type k: int
:type nums: List[int]
"""
#使用取出前k大的值,把这样的list变成heap
self.pool = heapq.nlargest(k, nums)
heapq.heapify(self.pool)
self.k = k
def add(self, val):
"""
:type val: int
:rtype: int
"""
if len(self.pool) < self.k:
heapq.heappush(self.pool, val)
else:
heapq.heappushpop(self.pool, val)
return self.pool[0]