优选算法_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();
    }
};
相关推荐
Geek-Chow14 分钟前
CountDownLatch in Java
java
漂流瓶jz24 分钟前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕33 分钟前
进一步了解模板
c++
SL_staff1 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程1 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff2 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
叠层归一研究院2 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
滕州市燕猫虎计算机科技工作室个体工商户2 小时前
IDEA:Command line is too long
java·ide·intellij-idea
步行cgn2 小时前
Spring p 命名空间注入详解
java·前端·spring