
解题步骤:











参考代码:
- 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
- {
- //比key小就交换到左边,记得是先++left,再交换
- if(nums[cur]
- {
- 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)的,这个快速选择算法是一个效率非常牛的算法哦!你学会了吗?如果你感觉到有所帮助,那么点点小心心,点点关注呗,后期还会持续更新力扣的经典题目哦,我们下期见!!!!
-
相关阅读:
81. this、call、apply、bind?
K8s如何启用cgroup2支持?
天翎知识管理系统为研究所文档管理组织创新赋能
list类型常用命令及其底层数据结构
【1day】PHPOK cms SQL注入学习
百度文心一率先言向全社会开放 应用商店搜“文心一言”可直接下载
ElasticSearch 之 数据类型
用VSCode做STM32项目遇到的问题
springboot配置文件自定义为json格式
notion database 必知必会
-
原文地址:https://blog.csdn.net/weixin_70056514/article/details/133221233