当前位置: 首页 > article >正文

【C++算法】45.分治_快排_数组中的第K个最大元素

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

215. 数组中的第K个最大元素


题目描述:

539c17ce94deaf7fe67885673e0c510b


解法

这种题是典型的TOPK算法

TOPK算法有四种典型的问法:

  1. K
  2. K
  3. K
  4. K

基于TOPK算法有两种办法:堆排序算法O(nlogn),快速选择算法O(n)

算法原理:

例如第K大的元素在>key的那一段,那么<key=key的两段都不用看了

f99299dff7c9522146f91db4d4d881a5

我们分别设三个区域的元素个数为a,b,c

d3a4e5db77e43d553222ef12b94a30c3


C++ 算法代码:

class Solution 
{
    public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        srand(time(NULL)); // 使用当前时间作为随机数生成的种子,确保每次运行程序时随机数不同
        return qsort(nums, 0, nums.size() - 1, k); // 调用快速选择函数(基于快速排序的分区思想)来查找第 k 大的元素
    }
    int qsort(vector<int>& nums, int l, int r, int k) // 快速选择函数,基于快速排序的分区思想,用于查找第 k 大的元素
    {
        if(l == r) return nums[l]; // 如果子区间的起始索引等于结束索引,说明找到了目标元素
        // 1. 随机选择基准元素
        int key = getRandom(nums, l, r); 
        // 2. 根据基准元素将数组分三块
        //    - 小于 key 的部分
        //    - 等于 key 的部分
        //    - 大于 key 的部分
        int left = l - 1, right = r + 1, 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; // a计算大于 key 的元素数量,b计算等于 key 的元素数量
        // 3. 根据 k 的值分情况讨论:
        //    - 如果大于 key 的元素数量 c 足够大,则递归查找右边的部分
        //    - 如果等于 key 的元素数量 b 足够大,则当前 key 即为目标元素
        //    - 否则,递归查找左边的部分,调整 k 的值
        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); //调整 k 的值为 k - b - c
    }
    int getRandom(vector<int>& nums, int left, int right) // 随机选择一个基准元素,用于快速选择
    {
        return nums[rand() % (right - left + 1) + left]; // 生成一个随机数,并将其映射到数组的索引范围内 [left, right]
    }
};

http://www.kler.cn/a/441499.html

相关文章:

  • Linux Nice 优先级功能解析
  • vscode无密码远程登录,不用输密码
  • 2024-2030全球与中国AI养猪解决方案市场现状及未来发展趋势
  • Flutter:页面中触发点击事件,通过id更新特定视图
  • Unreal的Audio::IAudioCaptureStream在Android中录制数据异常
  • 31.攻防世界php_rce
  • 被裁20240927 --- YOLO 算法
  • MFC 自定义网格控件
  • 解锁动态规划的奥秘:从零到精通的创新思维解析(1)
  • 解决 OpenCV 与 FFmpeg 版本不兼容导致的编译错误
  • RabbitMQ消息队列的笔记
  • Kafka篇之参数优化进而提高kafka集群性能
  • 【OpenCV计算机视觉】图像处理——平滑
  • DeepSeek-AI 开源 DeepSeek-VL2 系列,采用专家混合(MoE)架构,重新定义视觉语言人工智能
  • PyTorch中apex的安装方式
  • STT语音识别转文字工具 - 离线运行的本地语音识别服务
  • AI Agent与MEME:技术与文化融合驱动Web3创新
  • keepalive的高可用集群
  • k8s kubernetes
  • 【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案