跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法实战:数组中第 K 个最大元素与最小的 K 个数

综述由AI生成针对数组中第 K 个最大元素及最小 K 个数问题,采用快速选择算法(Quick Select)进行优化。通过随机基准划分三区,将时间复杂度从 O(NlogN) 降低至平均 O(N)。代码实现涵盖 C++ 版本,详细解析了分区逻辑与递归终止条件,适用于面试高频考点。

DevOpsTeam发布于 2026/3/24更新于 2026/6/620 浏览
算法实战:数组中第 K 个最大元素与最小的 K 个数

算法实战:数组中第 K 个最大元素与最小的 K 个数

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

题目链接

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

题目描述

给定整数数组 nums 和整数 k,请返回该数组中第 k 个最大的元素。

题目示例

题目示例

解法:快速选择算法

核心思路

快速选择(Quick Select)是快速排序的变种。在快排中,我们将数组划分为三个区域:小于基准、等于基准、大于基准。通过计算每个区域的元素数量,我们可以直接判断目标值落在哪个区间,从而避免对无关部分进行递归排序。

对于寻找第 k 大的元素,我们关注的是右侧的大数区域。如果右侧区域元素数量大于等于 k,说明目标就在右边;否则,我们需要调整 k 的值继续在左侧或中间查找。

C++ 代码实现
class Solution {
public:
    int Top_k(vector<int>& nums, int left, int right, int k) {
        if (left == right) {
            return nums[left];
        }
        
        // 随机选择基准元素,避免最坏情况
        int key = nums[rand() % (right - left + 1) + left];
        int l = left - 1, r = right + 1, i = left;
        
        // 三路划分:大于 key 的放右边,小于 key 的放左边
        while (i < r) {
            if (nums[i] > key) {
                swap(nums[i], nums[--r]);
            } else if (nums[i] < key) {
                swap(nums[i++], nums[++l]);
            } else {
                i++;
            }
        }
        
        // 若右边区域元素个数 >= k,说明第 k 大的数在右边区域
        if (right - r + 1 >= k) {
            return Top_k(nums, r, right, k);
        }
        // 若右边区域个数 < k,但中间加右边区域个数 >= k,说明第 k 大的数在中间区域
        else if (right - l >= k) {
            return key;
        }
        // 若中间加右边区域个数 < k,说明第 k 大的数在左边区域
        else {
            return Top_k(nums, left, l, k - (right - l));
        }
    }

    int findKthLargest(vector<int>& nums, int k) {
        srand(time(NULL));
        return Top_k(nums, 0, nums.size() - 1, k);
    }
};
流程解析

算法流程


46. 最小的 K 个数

题目链接

LCR 159. 库存管理 III - LeetCode

题目描述

仓库管理员以数组 stock 形式记录商品库存表。stock[i] 表示对应商品编号。请返回所有编号小于等于 cnt 的商品编号。

题目示例

题目示例

解法:快速选择算法

核心思路

这道题与上一题逻辑相似,只是方向相反。我们要找最小的 k 个数,因此需要关注左侧的小数区域。同样采用三路划分策略,将小于基准的元素移到左侧,统计左侧区域数量即可定位目标区间。

相比全排序(O(NlogN))和堆排序(O(NlogK)),快速选择在平均情况下时间复杂度接近 O(N),效率更高。

C++ 代码实现
class Solution {
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
        if (cnt == 0) {
            return {};
        }
        srand(time(NULL));
        Top_k(stock, 0, stock.size() - 1, cnt);
        return vector<int>(stock.begin(), stock.begin() + cnt);
    }

    void Top_k(vector<int>& nums, int left, int right, int cnt) {
        if (left == right) {
            return;
        }
        
        int key = nums[rand() % (right - left + 1) + left];
        int l = left - 1, r = right + 1, i = left;
        
        while (i < r) {
            if (nums[i] > key) {
                swap(nums[i], nums[--r]);
            } else if (nums[i] < key) {
                swap(nums[i++], nums[++l]);
            } else {
                i++;
            }
        }
        
        // 左侧区域(小于 key)元素个数 >= cnt,说明目标在左侧
        if (l - left + 1 >= cnt) {
            return Top_k(nums, left, l, cnt);
        }
        // 左侧加中间区域 >= cnt,说明目标已包含在左侧及中间,无需再分
        else if (r - left >= cnt) {
            return;
        }
        // 否则目标在右侧,需调整 cnt
        else {
            return Top_k(nums, r, right, cnt - (r - left));
        }
    }
};
流程解析

算法流程

目录

  1. 算法实战:数组中第 K 个最大元素与最小的 K 个数
  2. 45. 数组中的第 K 个最大元素
  3. 题目链接
  4. 题目描述
  5. 题目示例
  6. 解法:快速选择算法
  7. 核心思路
  8. C++ 代码实现
  9. 流程解析
  10. 46. 最小的 K 个数
  11. 题目链接
  12. 题目描述
  13. 题目示例
  14. 解法:快速选择算法
  15. 核心思路
  16. C++ 代码实现
  17. 流程解析
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 多端交互实测指南:Web/TUI/钉钉集成配置
  • PromptWizard 自动优化框架与 Level-Navi Agent 搜索代理实现思路
  • 网络安全应急响应流程与方法论
  • 双非本科工程造价转行 AIGC 产品经理的经验总结
  • 苍穹外卖前端开发:员工与套餐管理功能实现
  • 转行 Web 前端:短期自学路径与高薪就业指南
  • 自学AI大模型:新手常见的十大误区与避坑指南
  • MCP Server 实现 Excel 表格一键生成可视化图表 HTML 报告
  • 基于 Qwen1.5-1.8B-GPTQ-Int4 与 Chainlit 的思维导图自动生成
  • EnvPilot:基于 Rust 的跨平台环境变量管理工具
  • ComfyUI 深度解析:高性能 AI 绘画工作流实践
  • Git 远程仓库地址更换指南
  • 实用 AI 写作平台推荐:涵盖日常、论文及职场场景
  • MySQL 事务核心概念与四大特性详解
  • 基于 YOLO 与 LLM 的 Web 目标检测及人脸识别系统(Django+Vue3)
  • MySQL 权限管理与 C/C++ 开发对接指南
  • ROS 机器人开发入门:Linux 基础命令实战
  • 低代码结合大模型:中小企业半天构建专属 SaaS 应用路径
  • Star-Office-UI: 像素风格 AI 办公室看板,可视化 AI 助手工作状态
  • Python 爬虫实战:豆瓣电影 Top250 封面图片采集

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online