在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)
题目链接
代码:
class Solution {
public:
int findKthLargest(vector<int>& v, int m) {
int i,j,k,tmp,n=v.size();
for(i=n/2-1;i>=0;i--){
for(j=i;j*2+1<n&&j>=0;){
k=j*2+1;
if(j*2+1<n&&j*2+2<n){
if(v[j*2+1]<v[j*2+2]){
k=j*2+2;
}
}
if(v[k]>v[j]){
tmp=v[k];
v[k]=v[j];
v[j]=tmp;
j=k;
}else{
j--;
}
}
}
tmp=v[n-1];
v[n-1]=v[0];
v[0]=tmp;
for(i=1;i<m;i++){
for(j=0;j*2+1<n-i&&j<n-i;){
k=j*2+1;
if(j*2+1<n-i&&j*2+2<n-i){
if(v[j*2+1]<v[j*2+2]){
k=j*2+2;
}
}
if(v[k]>v[j]){
tmp=v[k];
v[k]=v[j];
v[j]=tmp;
j=k;
}else{
break;
}
}
tmp=v[n-1-i];
v[n-1-i]=v[0];
v[0]=tmp;
}
return v[n-m];
}
};