解题步骤:
参考代码:
class Solution {
public:
int QuickSelectSort(vector<int>& nums,int begin,int end,int k)
{
//随机选key
int key=nums[begin+rand()%(end-begin+1)];
//left在左端点前一个位置
int left=begin-1;
//right在右端点后一个位置
int right=end+1;
//cur从begin开始遍历
int cur=begin;
//当cur和right相遇就结束循环,因为[right,end]区间内的值是
//比key大的,cur与right相遇就说明整个数组已经全部遍历过了
while(cur<right)
{
//比key小就交换到左边,记得是先++left,再交换
if(nums[cur]<key)
{
swap(nums[++left],nums[cur++]);
}
//比key大就交换到右边,记得是先--right,再交换
else if(nums[cur]>key)
{
swap(nums[--right],nums[cur]);
}
//==key就跳过
else
{
cur++;
}
}
//a,b,c参考图片含义
int a=left-begin+1;
int b=(right-1)-(left+1)+1;
int c=end-right+1;
//参考图片判断规则
if(c>=k)
{
return QuickSelectSort(nums,right,end,k);
}
else if(b+c>=k)
{
return nums[left+1];
}
else
{
return QuickSelectSort(nums,begin,left,k-b-c);
}
}
int findKthLargest(vector<int>& nums, int k) {
srand((unsigned int)time(nullptr));
return QuickSelectSort(nums,0,nums.size()-1,k);
}
};
以上就是这道topk问题基本上算是最优的算法了,时间复杂度无限逼近与O(N)的,这个快速选择算法是一个效率非常牛的算法哦!你学会了吗?如果你感觉到有所帮助,那么点点小心心,点点关注呗,后期还会持续更新力扣的经典题目哦,我们下期见!!!!