《算法题讲解指南:优选算法-分治-快排》--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

基于claude-code+deepseek+openspec实现自动化代码生成个人教程

基于claude-code+deepseek+openspec实现自动化代码生成个人教程

基于claude-code+deepseek+openspec实现自动化代码生成 * 1、Claude-Code与OpenSpec简介 * 2、Claude-Code与OpenSpec代码生成的优点 * 3、前期准备 * 4、实践步骤 * 4.1、安装claude-code * 4.2、安装openspec * 5、使用教程 * 5.1、初始化项目 1、Claude-Code与OpenSpec简介 Claude-Code是Anthropic开发的代码生成模型,专注于理解自然语言描述并生成高质量代码。OpenSpec通常指开放的API规范标准(如OpenAPI/Swagger),用于标准化接口描述。两者结合可实现从接口文档到代码的自动化生成。 2、Claude-Code与OpenSpec代码生成的优点 准确性:基于规范化的OpenSpec描述,生成的代码能精确匹配接口需求,减少手动错误。 效率提升:自动生成基础代码(如API客户端、服务端桩代码),节省开发时间。 一致性:团队遵循同一规范,确保代码风格和接口定义统一。 维护性:OpenSp

By Ne0inhk
Flutter 组件 flutter_sheet_localization 的适配 鸿蒙Harmony 实战 - 驾驭云端词典自动化、实现鸿蒙端国际化词条无感更新与多语言 Key 生成方案

Flutter 组件 flutter_sheet_localization 的适配 鸿蒙Harmony 实战 - 驾驭云端词典自动化、实现鸿蒙端国际化词条无感更新与多语言 Key 生成方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 flutter_sheet_localization 的适配 鸿蒙Harmony 实战 - 驾驭云端词典自动化、实现鸿蒙端国际化词条无感更新与多语言 Key 生成方案 前言 在鸿蒙(OpenHarmony)生态的全球化应用开发中,面对上百个涉及金融支付、法律协议以及动态营销文案的多语言(i18n)词条映射。如果仅仅依靠传统的本地 intl 方案 手动修改 .arb 或 .json 文件。那么不仅会导致开发与翻译团队之间的“沟通断层”。更会因为频繁的手动拷贝错误引发严重的生产事故。 我们需要一种“云端协同、本地免维护”的翻译生产艺术。 flutter_sheet_localization 是一套专注于将 Google Sheets(或是兼容的 CSV 系统)

By Ne0inhk
【Linux】du 命令查看文件和目录的磁盘占用

【Linux】du 命令查看文件和目录的磁盘占用

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Linux这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Linux `du` 命令详解:精准探查文件和目录的磁盘占用 * 一、`du` 命令简介 * 1.1 为什么使用 `du`? * 1.2 `du` 命令的运行原理 * 1.3 基本用法示例 * 二、`du` 命令的基础用法 * 2.1 显示当前目录的磁盘占用 * 2.2 显示指定目录的磁盘占用 * 2.3 显示指定目录下所有文件和目录的占用 * 2.4 以人类可读格式显示 * 三、`du` 命令的高级选项详解 * 3.1

By Ne0inhk