数据流中第 K 大的元素(leetcode 703)
一:解题思路
在C++和Java中,使用最小堆或者最大堆,用一个优先队列即可。构造函数:Time:O(n*log(k)),添加函数:Time:O(log(k))
二:完整代码示例 (C++、Java、Python)
C++:
class KthLargest { private: priority_queue<int, vector<int>,greater<int>> minHeap;//默认为最大堆,所以后面要添加greater变为最小堆 int k; public: KthLargest(int k, vector<int>& nums) { this->k = k; for (int num : nums) add(num); } int add(int val) { if (minHeap.size() < k) minHeap.push(val); else if (val > minHeap.top()) { minHeap.pop(); minHeap.push(val); } return minHeap.top(); } };
Java:
class KthLargest { private Queue<Integer> minHeap=new PriorityQueue<>(); private int k; public KthLargest(int k, int[] nums) { this.k=k; for(int num:nums) add(num); } public int add(int val) { if(minHeap.size()<k) minHeap.add(val); else if(val>minHeap.peek()) { minHeap.poll(); minHeap.add(val); } return minHeap.peek(); } }
Python:
import heapq class KthLargest: def __init__(self, k: int, nums: List[int]): self.k=k self.heap=nums heapq.heapify(self.heap) while len(self.heap)>k: heapq.heappop(self.heap) def add(self, val: int) -> int: if len(self.heap)<self.k: heapq.heappush(self.heap,val) elif self.heap[0]<val: heapq.heapreplace(self.heap,val) return self.heap[0]

浙公网安备 33010602011771号