题目要求在一个无序数组中找到第K大的元素,不能使用排序。
最开始的想法是借用冒泡的思想两重循环去枚举,但是显然会超时,于是想到了二叉堆。
题目要求输出第K大,那么只需要在原数组上构建一个二叉堆,然后执行k-1次删除操作,堆顶即使答案。
class Solution {
public:
void update(vector<int>& arr, int i, int maxSize)
{
int maxn = i;
int left = i * 2 + 1;
int right = i * 2 + 2;
if (left < maxSize && arr[left] > arr[maxn])
{
maxn = left;
}
if (right < maxSize && arr[right] > arr[maxn])
{
maxn = right;
}
if (maxn != i)
{
swap(arr[i], arr[maxn]);
update(arr, maxn, maxSize);
}
}
void buildHeap(vector<int>& arr, int maxSize)
{
for(int i = maxSize/2; i >= 0; i--)
{
update(arr, i, maxSize);
}
}
int findKthLargest(vector<int>& nums, int k) {
int maxSize = nums.size();
buildHeap(nums, maxSize);
for(int i = nums.size()-1; i >= nums.size()-k+1; i--)
{
swap(nums[0], nums[i]);
maxSize--;
update(nums, 0, maxSize);
}
return nums[0];
}
};