Python3解leetcode Kth Largest Element in a Stream
问题描述:
Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Your KthLargest
class will have a constructor which accepts an integer k
and an integer array nums
, which contains initial elements from the stream. For each call to the method KthLargest.add
, return the element representing the kth largest element in the stream.
Example:
int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3); // returns 4 kthLargest.add(5); // returns 5 kthLargest.add(10); // returns 5 kthLargest.add(9); // returns 8 kthLargest.add(4); // returns 8
Note:
You may assume that nums
' length ≥ k-1
and k
≥ 1.
思路:
考虑堆的应用,heapq
代码:
1 class KthLargest: 2 3 def __init__(self, k: int, nums: List[int]): 4 nums.sort() 5 if len(nums) > k - 1: 6 nums = nums[-k:] 7 self.k = k 8 self.nums = nums 9 heapq.heapify(self.nums) 10 11 12 13 14 def add(self, val: int) -> int: 15 if len(self.nums) == self.k - 1: 16 heapq.heappush(self.nums,val) 17 elif val > self.nums[0]: 18 heapq.heapreplace(self.nums,val) 19 return self.nums[0] 20 21 22 23 24 # Your KthLargest object will be instantiated and called as such: 25 # obj = KthLargest(k, nums) 26 # param_1 = obj.add(val)
heapify(x) #以线性时间将一个列表转化为堆
heappush(heap,item) #往堆中插入一条新的值
item = heappop(heap) #从堆中弹出最小值
item = heap[0] #查看堆中最小值,不弹出
item = heapreplace(heap,item) #弹出并返回最小值,然后将heapqreplace方法中item的值插入到堆中,堆的整体结构不会发生改变