优选算法_topk问题_快速排序算法_堆_C++

一.题目解析

算法解析:快速排序算法

找到所在区间再进行快速排序(递归)

代码编写:

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();
    }
};
相关推荐
程序员老邢2 小时前
【技术底稿 32】Nginx 经典大坑复盘:本机公网域名自环代理,导致接口返回首页 / 404 实战排障
java·运维·nginx·前后端分离·技术底稿·后端部署
斯内科2 小时前
四胞胎素数:找出‌个位数分别是 1、3、7、9‌,且‌十位及更高位数字完全相同‌的质数,例如 11、13、17、19
算法·质数·素数·四胞胎素数
海盗12342 小时前
C#在Distinct()中使用IEqualityComparer<T>
开发语言·c#
Vertira3 小时前
python 配置PostgreSQL 数据库
开发语言·python
该昵称用户已存在3 小时前
从成本中心到价值引擎:MyEMS 开源系统激活企业能源数据资产
java·后端·struts
Hello.Reader3 小时前
算法基础(十二)——主方法:快速求解常见递归式
算法
想唱rap3 小时前
传输层协议TCP
linux·运维·服务器·网络·c++·tcp/ip
隐退山林3 小时前
JavaEE进阶:SpringBoot配置文件
java·spring boot·java-ee
阿维的博客日记3 小时前
求解深分页问题,last pk适合什么情况
java·mysql·深分页
小O的算法实验室3 小时前
2026年IEEE TITS,面向按需外卖配送调度的特定问题知识与基于学习元启发式算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进