class Solution {
public:
int findKthLargest(vector<int>& nums, int k)
{
int n = nums.size();
buildMaxHeap(nums, n);
for(int i=0;i<k-1;i++)
{
swap(nums[0],nums[n-1-i]);
Adjustdown(nums,n-1-i,0);
}
return nums[0];
}
void buildMaxHeap(vector<int>& nums , int sz)
{
for(int i = (sz - 1 -1)/2; i>=0; i--)
{
Adjustdown(nums,sz,i);
}
}
void Adjustdown(vector<int>& nums, int sz, int parent)
{
int child = parent*2+1; //默认左孩子大
while(child<sz)
{
if(child+1 < sz && nums[child] < nums[child+1])
{
child++;
}
if(nums[child] >nums[parent])
{
swap(nums[child],nums[parent]);
parent = child;
child = parent*2+1;
}
else break;
}
}
};
++快速选择:++
cpp复制代码
class Solution {
public:
int findKthLargest(vector<int>& nums, int k)
{
srand(time(NULL));
return quickSort(nums,0,nums.size()-1,k);
}
int quickSort(vector<int>& nums, int l, int r, int k)
{
if(l == r) return nums[l];
int key = getRandom(nums, l, r);
//数组分为三部分
int i = l, left = l-1, right = r+1;
while(i<right)
{
if(nums[i] < key) swap(nums[++left],nums[i++]);
else if(nums[i] > key) swap(nums[--right],nums[i]);
else i++;
}
//查看k在哪个区间
int c = r - right + 1,
b = right - left -1;
if(c >= k) return quickSort(nums,right,r,k);
else if(b+c >= k) return key;
else return quickSort(nums,l,left,k-b-c);
}
int getRandom(vector<int>& nums, int l, int r)
{
return nums[rand()%(r - l + 1) + l];
}
};