解题步骤:
参考代码:
class Solution {
public:int QuickSelectSort(vector<int>& nums,int begin,int end,int k){//随机选keyint 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)的,这个快速选择算法是一个效率非常牛的算法哦!你学会了吗?如果你感觉到有所帮助,那么点点小心心,点点关注呗,后期还会持续更新力扣的经典题目哦,我们下期见!!!!