在数组中找到第k大的元素
您在真实的面试中是否遇到过这个题?
Yes
样例
以下是一个更加快速的版本
给出数组[9,3,2,4,8],第三大的元素是4
给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推
class Solution {
public:
void insert(vector<int> &heap,int e){
heap.push_back(e);
int size=heap.size();
for(int i=size-1;i>0&&heap[i]<heap[(i-1)/2];i=(i-1)/2)
swap(heap[i],heap[(i-1)/2]);
}
void adjust(vector<int> &heap,int e){
heap[0]=e;
int c,size=heap.size();
for(int i=0;(c=2*i+1)<size;i=c){
if(c+1<size&&heap[c]>heap[c+1])
++c;
if(heap[i]<heap[c])
break;
swap(heap[i],heap[c]);
}
}
int kthLargestElement(int k, vector<int> nums) {
int size;
if((size=nums.size())<k)
return 0;
vector<int> heap;
for(int i=0;i<k;++i)
insert(heap,nums[i]);
for(int i=k;i<size;++i){
if(nums[i]>heap[0]){
adjust(heap,nums[i]);
}
}
return heap[0];
}
};
以下是一个更加快速的版本
class Solution{
public:
void insert(vector<int> &heap,int e){
heap.push_back(e);
int size=heap.size();
int tmp=heap[size-1];
int i;
for(i=size-1;i>0&&tmp<heap[(i-1)/2];i=(i-1)/2)
heap[i]=heap[(i-1)/2];
heap[i]=tmp;
}
void adjust(vector<int> &heap,int e){
heap[0]=e;
int c,size=heap.size();
int tmp=heap[0];
int i;
for(i=0;(c=2*i+1)<size;i=c){
if(c+1<size&&heap[c]>heap[c+1])
++c;
if(tmp<heap[c])
break;
heap[i]=heap[c];
}
heap[i]=tmp;
}
int kthLargestElement(int k, vector<int> nums) {
int size;
if((size=nums.size())<k)
return 0;
vector<int> heap;
for(int i=0;i<k;++i)
insert(heap,nums[i]);
for(int i=k;i<size;++i){
if(nums[i]>heap[0]){
adjust(heap,nums[i]);
}
}
return heap[0];
}
};