class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
for(int i = (n-1-1) / 2; i >= 0; i--) {
adjustHeap(nums, i, n);
}
for(int i = 0; i < k; i++) {
swap(nums[0], nums[n - i - 1]);
adjustHeap(nums, 0, n - i - 1);
}
return nums[n - k];
}
private:
void adjustHeap(vector<int>& nums, int pos, int size) {
int left = pos * 2 + 1;
int right = pos * 2 + 2;
if(left < size && nums[pos] < nums[left]) {
swap(nums[pos], nums[left]);
adjustHeap(nums, left, size);
}
if(right < size && nums[pos] < nums[right]) {
swap(nums[pos], nums[right]);
adjustHeap(nums, right, size);
}
}
};
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
class Solution{
public:
int findKthLargest(vector<int>& nums, int k)
{
int n = nums.size();
for(int i = (n-1-1)/2 ; i >= 0; i--)//在从0开始索引的数组中,最后一个元素的索引值为n-1,所以最后一个非叶子节点的索引值就应该是 (n-1-1)/2 = (n-2)/2。
adjustheap(nums, i, n);
for(int i = 0; i < k; i++)
{
swap(nums[0], nums[n-1-i]);
adjustheap(nums, 0, n-1-i);
}
return nums[n-k];
}
private:
void adjustheap(vector<int>& nums, int pos, int size)
{
int left = 2*pos + 1;
int right = 2*pos + 2;
if(left < size && nums[pos] > nums[left])
{
swap(nums[pos], nums[left]);
adjustheap(nums, left, size);
}
if(right < size && nums[pos] > nums[right])
{
swap(nums[pos], nums[right]);
adjustheap(nums, right, size);
}
}
};
int main()
{
vector<int> nums;
int len = 100;
srand(time(NULL));
for(int i = 0; i < len; i++)
nums.push_back(rand()%1000);
int k = 15;
int ans = Solution().findKthLargest(nums, k);
cout << "ans = " << ans << endl;
for(int i = 0; i < len; i++)
cout << nums[i] << " ";
cout << endl;
return 0;
}
ps:代码来自某大佬,做了小小修改。