703. 数据流中的第K大元素

 1 using namespace std;
 2 class KthLargest {
 3 public:
 4     KthLargest(int k, vector<int>& nums) {
 5         
 6         pos = k;
 7         data.assign(nums.begin(),nums.end());
 8         sort(data.begin(),data.end(),greater<int>());//从大到小进行排序
 9         
10         if(data.size() > pos) data.erase(data.begin()+pos,data.end());//进行删除操作 只保留前k个数     
11         make_heap(data.begin(), data.end(), greater<int>());//构建一个小根堆
12     }
13     
14     int add(int val) {
15        if(data.size() < pos)
16        {
17 //           cout << val << endl;
18            data.push_back(val);//插入值
19            push_heap(data.begin(), data.end(),greater<int>());//重新设置堆
20            return data[0];
21        }
22     
23        if(val >= data[0])
24         {
25            pop_heap(data.begin(),data.end(), greater<int>());//将最大根拉到最后一个位置 剩下[first,last-1)重新构造堆
26            data.pop_back();//删除根   
27            data.push_back(val);//插入值     
28            push_heap(data.begin(), data.end(), greater<int>());//重新设置堆   
29         }
30         return data[0];
31     }
32     
33 private:
34     vector<int> data;
35     int pos;
36 };
37 
38 /**
39  * Your KthLargest object will be instantiated and called as such:
40  * KthLargest* obj = new KthLargest(k, nums);
41  * int param_1 = obj->add(val);
42  */

 

posted @ 2019-06-11 20:01  robinjr  阅读(33)  评论(0)    收藏  举报