《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数

《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--优选算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

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

题目链接:

题目描述:

题目示例:

解法(快速选择算法):

算法思路:

C++算法代码:

算法总结及流程解析:

46.最小的k个数

题目链接:

题目描述:

题目示例:

​编辑

解法(快速选择算法):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


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

题目链接:

215. 数组中的第K个最大元素 - 力扣(LeetCode)

题目描述:

题目示例:

解法(快速选择算法):

算法思路:

      在快排中,当我们把数组「分成三块」之后:[ left ,l ] [ l + 1,r - 1 ] [ r,right ],我们可以通过计算每一个区间内元素的「个数」,进而推断出我们要找的元素是在「哪一个区间」里面。

      那么我们可以直接去「相应的区间」去寻找最终结果就好了。

C++算法代码:

class Solution { public: int Top_k(vector<int>& 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(vector<int>& nums, int k) { srand(time(NULL)); return Top_k(nums, 0, nums.size() - 1, k); } };

算法总结及流程解析:

46.最小的k个数

题目链接:

LCR 159. 库存管理 III - 力扣(LeetCode)

题目描述:

题目示例:

解法(快速选择算法):

算法思路:

      在快排中,当我们把数组「分成三块」之后:[ l,left ] [ left + 1,right -1 ] [ right,r ],我们可以通过计算每一个区间内元素的「个数」,进而推断出最小的k个数在哪些区间里面。
      那么我们可以直接去「相应的区间」继续划分数组即可。

C++算法代码:

class Solution { public: vector<int> inventoryManagement(vector<int>& stock, int cnt) { // //解法一:快排(优点:简单无脑;缺点:时间复杂度很大O(NlogN)) // sort(stock.begin(), stock.end()); // vector<int> ret; // for(int i = 0; i < cnt; i++) // { // ret.push_back(stock[i]); // } // return ret; // //解法二:堆排序(优点:时间复杂度比快排小:O(Nlogk);缺点:比较难想) // vector<int> ret; // if(cnt == 0) // { // return {}; // } // priority_queue<int> 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 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++; } } 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个数 同样采用三区划分策略,通过计算各区元素数量直接定位目标区间,相比排序和堆方法更高效。希望大家能有所收获!

Read more

Spring Boot 配置文件深度解析

Spring Boot 配置文件深度解析

—JavaEE专栏— Spring Boot 配置文件深度解析:从基础语法到验证码实战 摘要 本文深入探讨了 Spring Boot 配置文件的核心作用及其主流格式。通过对比 Properties 与 YAML (YML) 的语法差异、优先级及适用场景,结合 @Value 与 @ConfigurationProperties 注解的代码实战,帮助开发者掌握配置读取的高级技巧。文章最后通过一个“图形验证码”综合案例,演示了如何将配置项优雅地集成到实际业务中。 目录 文章目录 * Spring Boot 配置文件深度解析:从基础语法到验证码实战 * 摘要 * 目录 * @[toc] * 1. 配置文件概述:告别硬编码 * 2. Spring Boot 配置文件的三大格式 * 2.1 优先级与共存说明 * 3. Properties 语法与读取实战 * 3.

By Ne0inhk
阿里 RynnBrain 具身智能开源登顶!30B MoE 时空记忆架构,16 项评测超谷歌 Gemini,机器人开发从 0 到 1 实战教程

阿里 RynnBrain 具身智能开源登顶!30B MoE 时空记忆架构,16 项评测超谷歌 Gemini,机器人开发从 0 到 1 实战教程

当前具身智能技术正处于从实验室走向产业落地的关键阶段,行业普遍面临三大核心痛点:一是通用大模型在具身场景中存在空间感知精度不足、长时序动作规划遗忘的问题;二是稠密参数大模型端侧部署算力门槛过高,难以适配机器人本体的低延迟控制需求;三是机器人开发链路复杂,从感知、决策到控制的全流程对齐难度大,中小厂商与开发者难以快速实现定制化落地。 针对上述行业痛点,阿里发布的RynnBrain具身智能大模型正式开源,其基于30B MoE稀疏激活架构与时空记忆双轨设计,在全球16项主流具身智能基准评测中综合性能超越谷歌Gemini系列模型,同时提供了完整的机器人开发工具链,大幅降低了具身智能应用的落地门槛。本文将从核心技术原理、全流程开发实战、产业落地实践三个维度,对RynnBrain开源方案进行全面拆解,为开发者提供可直接复用的技术实现路径。 1 核心技术原理与架构设计 1.1 整体架构总览 RynnBrain采用端到端的具身智能全链路架构设计,整体分为四大核心模块,实现从环境感知、记忆存储、决策规划到动作执行的完整闭环,各模块能力解耦且可独立扩展,适配不同场景的定制化需求: 1. 多

By Ne0inhk
Spring Boot 全局异常处理策略设计(二):DispatcherServlet 与异常解析责任链源码解析

Spring Boot 全局异常处理策略设计(二):DispatcherServlet 与异常解析责任链源码解析

文章目录 * Spring Boot 全局异常处理策略设计(二):DispatcherServlet 与异常解析责任链源码解析 * 1. 为什么一定要从 DispatcherServlet 讲起 * 2. DispatcherServlet 在请求中的角色定位 * 3. doDispatch:异常真正被捕获的地方 * 3.1 doDispatch 的整体结构(简化) * 3.2 Throwable 为什么会被单独捕获? * 4. processDispatchResult:异常处理的真正入口 * 5. processHandlerException:责任链的起点 * 6. HandlerExceptionResolver 责任链模型 * 6.1 接口定义 * 6.2 默认的三个异常解析器 * 7. Resolver 链的执行顺序是如何确定的 * 8. 异常是如何被“吃掉”的? * 9. 如果所有

By Ne0inhk
RabbitMQ - 集群中队列的镜像配置:高可用保障

RabbitMQ - 集群中队列的镜像配置:高可用保障

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕RabbitMQ这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * RabbitMQ - 集群中队列的镜像配置:高可用保障 🛡️ * 什么是 RabbitMQ 镜像队列?🔍 * RabbitMQ 集群基础回顾 🏗️ * 集群类型 * 节点角色 * 镜像队列的工作原理 ⚙️ * 主从架构 * 故障转移(Failover) * 同步与异步复制 * 配置镜像队列的三种方式 🛠️ * 1. 通过策略(Policy)配置(推荐)✅ * 创建镜像策略 * 策略参数详解 * 2. 通过队列声明参数(不推荐)❌ * 3. 通过管理插件 Web UI 配置 🖥️ * Java 客户端集成示例 💻 * 环境准备

By Ne0inhk