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  */

 

posted @ 2021-03-13 20:01  Mrsdwang  阅读(51)  评论(0)    收藏  举报