在未排序的数组中找到第 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 ≤ 数组的长度。
class Solution {
public:
void swap(int x,int y,vector<int>&nums){
int t=nums[x];
nums[x]=nums[y];
nums[y]=t;
}
void down(int i,int n,vector<int>& nums){
int parent=i;
int child=2*parent+1;
while(child<n){
if(child+1<n&&nums[child]<nums[child+1]){
child++;
}
if(nums[parent]<nums[child]){
swap(parent,child,nums);
parent=child;
}
child=2*child+1;
}
}
int findKthLargest(vector<int>& nums, int k) {
size=nums.size();
for(int i=size/2-1;i>=0;i--){
down(i,size,nums);
}
for(int i=1;i<k;i++){
swap(0,size-i,nums);
down(0,size-i,nums);
}
return nums[0];
}
int size;
};
class Solution {
public:
void swap(int x,int y){
int t=num[x];
num[x]=num[y];
num[y]=t;
}
void buildHeap(){
for(int i=size/2-1;i>=0;i--){
down(i,size);
}
}
void down(int i,int n){
int parent=i;
int child=2*parent+1;
while(child<n){
if(child+1<n&&num[child]<num[child+1]){
child++;
}
if(num[parent]<num[child]){
swap(parent,child);
parent=child;
}
child=2*child+1;
}
}
int findKthLargest(vector<int>& nums, int k) {
size=nums.size();
num=new int[size];
for(int i=0;i<size;i++){
num[i]=nums[i];
}
buildHeap();
for(int i=1;i<k;i++){
swap(0,size-i);
down(0,size-i);
}
return num[0];
}
int *num;
int size;
};