《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数 📅 发布时间:2026/7/15 5:31:55 👁️ 浏览次数: 小叶-duck个人主页❄️个人专栏《Data-Structure-Learning》《C入门到进阶自我学习过程记录》《算法题讲解指南》--优选算法✨未择之路不须回头已择之路纵是荆棘遍野亦作花海遨游目录45.数组中的第k个最大元素题目链接题目描述题目示例解法(快速选择算法)算法思路C算法代码算法总结及流程解析46.最小的k个数题目链接题目描述题目示例编辑解法(快速选择算法)算法思路C算法代码算法总结及流程解析结束语45.数组中的第k个最大元素题目链接215. 数组中的第K个最大元素 - 力扣LeetCode题目描述题目示例解法(快速选择算法)算法思路在快排中当我们把数组「分成三块」之后[ left l ] [ l 1r - 1 ] [ rright ]我们可以通过计算每一个区间内元素的「个数」进而推断出我们要找的元素是在「哪一个区间」里面。那么我们可以直接去「相应的区间」去寻找最终结果就好了。C算法代码class Solution { public: int Top_k(vectorint nums, int left, int right, int k) { if(left right) { return nums[left]; } int l left - 1, r right 1, i left; //1、随机选择基准元素 int key nums[rand() % (right - left 1) left]; //2、根据基准元素将数组分三块 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大的数在中间区域则就是key else if(right - l k) { return key; } //若中间加右边区域个数k说明第k大的数在左边区域继续判断 //对于整个数组第k大的数在左边区域相当于是第(k-中间区域个数-右边区域个数)大的数 else { return Top_k(nums, left, l, k - (right - l)); } } int findKthLargest(vectorint nums, int k) { srand(time(NULL)); return Top_k(nums, 0, nums.size() - 1, k); } };算法总结及流程解析46.最小的k个数题目链接LCR 159. 库存管理 III - 力扣LeetCode题目描述题目示例解法(快速选择算法)算法思路在快排中当我们把数组「分成三块」之后[ lleft ] [ left 1right -1 ] [ rightr ]我们可以通过计算每一个区间内元素的「个数」进而推断出最小的k个数在哪些区间里面。那么我们可以直接去「相应的区间」继续划分数组即可。C算法代码class Solution { public: vectorint inventoryManagement(vectorint stock, int cnt) { // //解法一快排(优点简单无脑缺点时间复杂度很大O(NlogN)) // sort(stock.begin(), stock.end()); // vectorint ret; // for(int i 0; i cnt; i) // { // ret.push_back(stock[i]); // } // return ret; // //解法二堆排序(优点时间复杂度比快排小O(Nlogk)缺点比较难想) // vectorint ret; // if(cnt 0) // { // return {}; // } // priority_queueint pq(stock.begin(), stock.begin() cnt); // for(int i cnt; i stock.size(); i) // { // if(pq.top() stock[i]) // { // pq.pop(); // pq.push(stock[i]); // } // } // while(!pq.empty()) // { // ret.push_back(pq.top()); // pq.pop(); // } // return ret; //解法三快速选择排序(优点时间复杂度非常小逼近O(N)缺点方法很巧妙很难想到) if(cnt 0) { return {}; } srand(time(NULL)); Top_k(stock, 0, stock.size() - 1, cnt); return vectorint(stock.begin(), stock.begin() cnt); } void Top_k(vectorint 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; } } if(l - left 1 cnt) { return Top_k(nums, left, l, cnt); } else if(r - left cnt) { return; } else { return Top_k(nums, r, right, cnt - (r - left)); } } };算法总结及流程解析结束语到此45.数组中的第k个最大元素46.最小的k个数 这两道算法题就讲解完了。45.数组中的第k个最大元素 通过随机基准元素将数组划分为三区大于、等于、小于基准根据各区元素数量递归查找目标区间时间复杂度接近O(N)。46.最小的k个数 同样采用三区划分策略通过计算各区元素数量直接定位目标区间相比排序和堆方法更高效。希望大家能有所收获
引用(基础) 引用的语法1.作用:给一个变量起别名2.示例int a 10; int &b a; //当对b进行修改时 b100; //相应的a也会修改引用的注意事项1.引用定义时,必须进行初始化int a 10; //int &c; 错误,引用必须进行初始化 int &c a; //正确2.引… 2026/7/13 7:50:34
论文AIGC率80%降至5%实测:DeepSeek+豆包+Gemini去AI味指令及工具横评 辛辛苦苦熬大夜写出来的论文,因为逻辑太严谨、用词太规范,结果导致AI率飙升,这种想砸电脑的冤枉气我太懂了。 为了帮大家解决降低AI率的问题,我专门对 DeepSeek、豆包、Gemini 这三款主流模型,摸索出了一套反逻辑的降… 2026/7/9 8:15:27
400G光模块介绍 400G光模块的定义400G光模块是一种用于高速光纤通信的光电转换设备,支持单通道或多通道传输,总速率达到400Gbps(千兆比特每秒)。主要用于数据中心、电信网络和高性能计算等场景,满足日益增长的大带宽需求。技术标准与封… 2026/7/12 9:11:13
蓝牙音频模块与喇叭改造:从参数匹配到功能实现的完整指南 那天整理抽屉,翻出一个吃灰多年的小喇叭,标签上还印着“2.9元包邮”的字样。插上电试了试,声音居然还能响,但除了偶尔当个桌面提示音,实在想不出它还能干什么。正好手边有个之前淘来的蓝牙收音机模块,标价1… 2026/7/15 5:23:11
Unity机器人仿真:从URDF导入到ROS通信的完整实践指南 1. 项目概述:为什么选择Unity进行机器人仿真?如果你正在接触机器人开发,无论是学术研究、工业应用还是个人项目,大概率都听过一个词:仿真。在真实机器人上调试代码,成本高昂、风险大、效率低。一个简单的逻… 2026/7/15 5:17:09
基于Qt C++的配置文件编辑器:实现数据与UI双向绑定的工程实践 1. 项目概述:为什么我们需要一个自己的配置文件编辑器?在桌面软件开发中,配置文件(如INI、JSON、XML、YAML)是连接程序与用户的桥梁。它们存储着程序的设置、用户偏好、运行参数等关键信息。然而,对于非技术… 2026/7/15 5:15:08
C++实现序列二次规划SQP:从原理到工程实践详解 1. 项目概述与核心价值在工程优化、机器人控制、金融建模乃至机器学习等领域,我们常常会遇到一个核心问题:如何在一个充满约束的复杂环境中,找到某个目标函数的最佳解?这类问题通常被称为非线性规划问题。它们不像线性规划那样有现… 2026/7/15 5:13:07
2026工作总结工具哪家好用?5款AI工具实测对比,告别无效熬夜写总结 一、前言作为深耕AI办公领域的博主,后台经常收到粉丝提问:周报、月报、季度总结、年终总结到底用什么工具写最高效?相信绝大多数职场人、开发者、在校生都有同一个痛点:日常工作忙到饱和,一到写总结就卡壳。要么是没有… 2026/7/15 5:11:06
AI辅助游戏开发效率对比:从12小时到35分钟的原型构建实践 1. 项目概述:一次关于游戏开发效率的“极限”测试最近在独立游戏开发者的小圈子里,一个话题讨论得挺热:AI辅助开发工具到底能不能、以及能在多大程度上改变我们做游戏的节奏?正好,我手头有个一直想尝试的小游戏点子&am… 2026/7/15 5:09:05
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41