


int findKthLargest(vector<int>& nums, int k)
{
sort(nums.begin(),nums.end(),greater<int>());
return nums[k-1];
// O(N)
//大堆
priority_queue<int> pq(nums.begin(),nums.end());
while(--k)
{
pq.pop();
}
return pq.top();
//K*logN
}
int findKthLargest(vector<int>& nums, int k)
{
//小堆
//(N-K)*logN
priority_queue<int,vector<int>,greater<int>> pq(nums.begin(),nums.begin()+k);//建k个数的小堆
for(int i = k;i < nums.size();i++)
{
if(nums[i] > pq.top())
{
pq.pop();
pq.push(nums[i]);
}
}
return pq.top();
}
int findKthLargest(vector<int>& nums, int k)
{
//快排
srand(time(NULL));
return qsort(nums,0,nums.size()-1,k);
}
int qsort(vector<int>& nums,int l,int r,int k)
{
if(l == r) return nums[l];
//随机选择基准元素
int key = getRandom(nums,l,r);
//基准元素分三块
int left = l-1,right = r+1,i = l;
while(i<right)
{
if(nums[i]<key) swap(nums[++left],nums[i++]);
else if(nums[i] == key) i++;
else swap(nums[i],nums[--right]);
}
//分情况讨论
int c = r - right +1,b = right - left - 1;
if(c>=k) return qsort(nums,right,r,k);
else if(b+c>=k) return key;
else return qsort(nums,l,left,k-b-c);
}
int getRandom(vector<int>& nums,int left,int right)
{
return nums[rand() % (right - left + 1) + left];
}