设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest
类需要一个同时接收整数 k
和整数数组nums
的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add
,返回当前数据流中第K大的元素。
思路:维护一个小顶堆,代码参考leetcode一大佬。解释贼清楚,哈哈哈。
python语法:
堆的定义:
堆是一种特殊的数据结构,它的通常的表示是它的根结点的值最大或者是最小。
python中heapq的使用
列出一些常见的用法:
heap = []#建立一个常见的堆
heappush(heap,item)#往堆中插入一条新的值
item = heappop(heap)#弹出最小的值
item = heap[0]#查看堆中最小的值,不弹出
class KthLargest:
def __init__(self, k, nums):
"""
:type k: int
:type nums: List[int]
"""
# k指第K大元素
self.k = k
# 设置一个空堆
self.heap = []
# 往堆里扔数
for n in nums:
self.add(n)
# 每次add的数,都会被考虑要不要放入小顶堆里进行更新
def add(self, val):
"""
:type val: int
:rtype: int
"""
# 堆里只要保持k个数就行了,小顶堆的头就是第k个最大值
if len(self.heap) < self.k:
heapq.heappush(self.heap, val)
# 每次只有当val大于顶堆的跟节点,才更新掉,这样就保证了K都是top最大的元素
elif self.heap[0] < val:
heapq.heappop(self.heap)
heapq.heappush(self.heap, val)
return self.heap[0]