703. Kth Largest Element in a Stream
仅供自己学习
思路:
一开始是想直接sort,然后取出第K大的元素,但是测试数据还会调用add一直加入新元素,如果一直sort会消耗大量时间
另一种就是考虑把第K大后的数都剔除掉,只留下第K大和第K-1,K-2大的数。所以使用一个优先队列,并按小根堆的排序进行。
我们剔除元素的条件是 堆的size是否大于K,当大于K后,他会剔除堆当前最小的数,所以size会一直维持在K个数。这种做法不会删除第K大的数,因为只有所有元素添加后,又因为限制了K个元素存在在堆上,只有这时候再pop(),才会将第K大的剔除掉。
1 class KthLargest { 2 public: 3 priority_queue<int,vector<int>,greater<int>> q; 4 int k; 5 KthLargest(int k, vector<int>& nums) { 6 this->k=k; 7 for(auto& a:nums){ 8 add(a); 9 } 10 } 11 12 int add(int val) { 13 q.push(val); 14 if(q.size()>k) 15 q.pop(); 16 return q.top(); 17 } 18 }; 19 20 /** 21 * Your KthLargest object will be instantiated and called as such: 22 * KthLargest* obj = new KthLargest(k, nums); 23 * int param_1 = obj->add(val); 24 */

浙公网安备 33010602011771号