优选算法_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();
    }
};
相关推荐
大鹏说大话14 分钟前
美业微信会员系统哪个好
开发语言
古法安卓17 分钟前
Android-epoll原理详解
android·java·android studio
大熊背18 分钟前
树莓派IspPipeline LSC模块原理详解
算法·lsc·isppipeline·mesh lsc
fireworks9920 分钟前
接口鉴权(401与403)
java·后端
wear工程师25 分钟前
线程池里的异常去哪了?execute 和 submit 不是一回事
java
孔明click3332 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·sa-token·springboot·权限·权限认证
吴声子夜歌36 分钟前
Java面试——设计模式(一)
java·设计模式·面试
半亩码田1 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
zander2581 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
老郑聊AI业财智造1 小时前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程