一.题目解析

算法解析:快速排序算法

找到所在区间再进行快速排序(递归)
代码编写:
cpp
class Solution {
public:
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)
{
int left=l-1,right=r+1;
int key=getrandom(nums,l,r);
int i=l;
while(i<right)
{
if(nums[i]<key)swap(nums[++left],nums[i++]);
else if(nums[i]==key) i++;
else swap(nums[--right],nums[i]);
}
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 l,int r)
{
return nums[rand()%(r-l+1)+l];
}
};
算法解析:堆
topk问题用数据结构堆很好解决,第几大元素,我们只需要建立一个小根堆(priority_queue(int,vector<int>,greater<int>)),循环->1.依次推进,判断堆的大小是否超过k(遍历完成后堆顶就是topk元素)
代码编写:
cpp
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>,greater<int>>heap;
for(auto x:nums)
{
heap.push(x);
if(heap.size()>k)heap.pop();
}
return heap.top();
}
};