这题其实理解了也就不难,就是在遍历所有元素的过程中高位池一个小根堆。每次遍历到一个新元素的时候,先判断队中元素个数是否小于k,若小于,则插入堆,否则就和堆顶元素比较。若大于堆顶元素,则先将堆顶元素pop,再插入新元素。
为了练习一下堆的写法,就不用stl的priority_que啦。
class Solution {
protected:
void exchange(int &a, int &b){
int t = a;
a= b;
b =t;
}
public:
/**构造小根堆*/
void insert(vector<int> &que, int num){
que.push_back(num);
int i = que.size()-1;
while(i>0){
int par = (i-1)>>1;
if(que[par]<=que[i]){
break;
}
//交换
exchange(que[par], que[i]);
i=par;
}
}
void erase(vector<int> &que){
exchange(que.back(), que[0]);
que.pop_back();
int n = (que.size()-1)>>1;
/*调整*/
int i = 0;
while(i<n){
if(que[i]<=que[i*2+1]&&que[i]<=que[2*i+2]){
break;
}
if(que[i*2+1]<=que[2*i+2]){
exchange(que[i],que[i*2+1]);
i = 2*i+1;
}else{
exchange(que[i],que[i*2+2]);
i = 2*i+2;
}
}
}
int findKthLargest(vector<int>& nums, int k) {
vector<int> que;
for(int i=0;i<nums.size();i++){
if(que.size()<k){
insert(que, nums[i]);
}else{
int tmp = nums[i];
if(que[0]<nums[i]){
erase(que);
insert(que, nums[i]);
}
}
}
return que[0];
}
};