参考: 堆排序
方法一: 利用c++中的priority_queue建立小顶堆。
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>,greater<int>> minHeap; //加一个greater<int>构造小顶堆,不加默认构造大顶堆
int len = nums.size();
bool globalStatus = false;
if(len <= 0 || k < 0 || k > len)
{
globalStatus = true;
return 0;
}
for(int i = 0; i < len;i++)
{
if(minHeap.size() < k)
minHeap.push(nums[i]);
else if(nums[i] > minHeap.top()){
minHeap.pop();
minHeap.push(nums[i]);
}
}
return minHeap.top();
}
方法二:与方法一相同,但是自己构造小顶堆(初始建堆与重建堆)
int findKthLargest(vector<int>& nums, int k) {
vector<int> heap(k);
for(int i = 0;i < k;i++){
heap[i] = nums[i];
}
for(int i = k/2 - 1;i >= 0;i--){ //从最后一个父节点开始,对每个父节点进行调整操作
min_Heapify(heap, i, k);//从下至上初始化堆
}
for(int i = k;i < nums.size();i++){ //数组后面的数是否进堆
if(nums[i] > heap[0])
{
heap[0] = nums[i]; //进堆
min_Heapify(heap, 0, k);//堆化,找到新加的数在堆中合适的位置
}
}
return heap[0];
}
void min_Heapify(vector<int>& nums,int start,int end){
int dad = start;
int son = dad * 2 + 1;
int tmp = 0;
while(son < end){
if (son + 1 < end && nums[son] > nums[son + 1])
son++;
if(nums[dad] > nums[son])
{
tmp = nums[son];
nums[son] = nums[dad];
nums[dad] = tmp;
dad = son;
son = dad * 2 + 1;
}
else
break; //默认左右子树已是堆
}
return;
}