此问题,最简单的解决方法就是排序:
1、如果使用排序算法,有很多:快排、堆排序、归并排序等,它们的时间复杂度都是n*log(n)级别的;
2、这里可以使用堆排序进行优化,首先对初始数组进行最大堆初始化,之后每次都用数组最后的元素覆盖堆顶的元素,循环(k-1)次后堆顶元素即为答案。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//对nums进行初始化,构建最大堆
BuildMaxHeap(nums);
//循环(k-1)次,返回堆顶的元素即为第K大的元素
for(int i=1;i<k;i++){
ExtractMax(nums);
}
return nums[0];
}
//最大堆的维护
void MaxHeapify(vector<int>& nums,int i){
int sz=nums.size();
int lChild=2*i+1;
int rChild=2*i+2;
int largest=i;
if(lChild<sz&&nums[lChild]>nums[i]){
largest=lChild;
}
if(rChild<sz&&nums[rChild]>nums[largest]){
largest=rChild;
}
if(largest!=i){
swap(nums[i],nums[largest]);
MaxHeapify(nums,largest);
}
}
//建立最大堆
void BuildMaxHeap(vector<int>& nums){
int sz1=(nums.size()-2)/2;
for(int i=sz1;i>=0;i--){
MaxHeapify(nums,i);
}
}
//从堆顶取出最大的元素,维护堆的性质
int ExtractMax(vector<int> &nums){
if(nums.size()<1){
cerr<<"Heap UnderFlow"<<endl;
}
int max=nums[0];
nums[0]=nums[nums.size()-1];
nums.pop_back();
MaxHeapify(nums,0);
return max;
}
};