《算法题讲解指南:优选算法-分治-快排》--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 Cloud之服务入口Gateway之自定义过滤器

Spring Cloud之服务入口Gateway之自定义过滤器

目录 过滤器执行顺序 自定义过滤器 自定义GatewayFilter 定义GatewayFilter 配置过滤器 启动服务并访问 自定义GlobalFilter 定义GlobalFilter 启动服务并访问 服务部署 过滤器执行顺序 如果⼀个项⽬中, 既有GatewayFilter, ⼜有 GlobalFilter时, 执⾏的先后顺序是什么呢? 请求路由后, ⽹关会把当前项⽬中的GatewayFilter和GlobalFilter合并到⼀个过滤器链(集合)中, 并进⾏排序, 依次执⾏过滤器. 每⼀个过滤器都必须指定⼀个int类型的order值, 默认值为0, 表⽰该过滤的优先级. order值越⼩,优先级越⾼,执⾏顺序越靠前. • Filter通过实现Order接⼝或者添加@Order注解来指定order值. • Spring Cloud Gateway提供的Filter由Spring指定. ⽤⼾也可以⾃定义Filter, 由⽤⼾指定.

By Ne0inhk
Agent系列——SPring AI Alibaba Graph初探

Agent系列——SPring AI Alibaba Graph初探

文章目录 * 一、概述 * 为什么需要Graph * 核心概念 * 二、快速入门 * 依赖版本 * pom.xml添加核心依赖 * 修改配置文件application.yaml * 创建状态图的配置类 * 创建一个Controller * 启动程序,查看效果 * 三、API详解 * KeyStrategyFactory(键策略工厂) * NodeAction&AsyncNodeAction * stateGraph(状态图) * CompiledGraph(编译图) * 四、案例:开发一个英语学习小助手 * 需求 * 思路分析 * 流程图 * 代码编写 * 定义SentenceConstructionNode造句节点 * 定义TranslationNode翻译节点 * 定义状态图 * 新增API接口 * 启动服务,访问接口 * 五、条件边 * 代码结构 * 定义GenerateJokeNode生成笑话节点 * 定

By Ne0inhk
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)

SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)

SQL Server是由微软推出的关系型数据库管理系统,它提供了可靠的数据存储、数据管理和数据分析功能。SQL Server支持多种数据处理功能,包括事务处理、数据分析、报表生成和数据挖掘等,因此在企业和组织中得到广泛应用。 演示系统:Windows server 2025数据中心版 安装包:下载传送门 1、下载并解压安装包,找到解压的安装包,双击【setup.exe】 2、双击【setup.exe】就会打开SQL Server安装中心,点击【安装】-【全新安装或向现有安装添加功能】 3、选择对应版本后,下一步 4、勾选“我接受许可条款”后下一步 5、下一步下一步 6、不勾选,下一步 7、勾选需要的功能,路径建议默认,下一步 8、下一步

By Ne0inhk
MySQL 数据类型核心指南:选型、实战与避坑

MySQL 数据类型核心指南:选型、实战与避坑

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. MySQL 数据类型分类总览 * 二. 数值类型:精准匹配数字范围与精度 * 2.1 整数类型(BIT/TINYINT/INT/BIGINT) * 2.1.1 TINYINT 类型测试 * 2.1.2 BIT 类型测试 * 2.1.3 INT/BIGINT 对比测试 * 2.2 小数类型(FLOAT/DOUBLE/DECIMAL) * 2.2.

By Ne0inhk