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

开源项目:Z-Image 轻量高效的开源 AI 图像生成模型

开源项目:Z-Image 轻量高效的开源 AI 图像生成模型

🚀 1、简述 Z-Image 是阿里巴巴通义实验室(Tongyi-MAI)最新开源的 AI 图像生成基础模型,主打 “高质量、低显存、开源可商用”。该模型具有仅 60 亿参数 却能生成媲美许多大参数闭源模型的照片级图像,同时支持中英双语文本渲染,是当下最受关注的图像生成开源项目之一。 📌 2、什么是 Z-Image? Z-Image 是一个高效的文本生成图像(Text-to-Image)基础模型,目标是让图像生成变得更快、更轻、更容易部署: ✨ 6B 参数量级 — 较大型模型(如 20B+)体量更小、效率更高。 ⚡ S3-DiT 架构(Single-Stream Diffusion Transformer) — 将文本与图像潜空间统一处理,提高参数与推理效率。 📊 多版本支持 — 包括 Z-Image-Turbo(极速生成)、Z-Image-Base(基础生成)、Z-Image-Edit(图像编辑)

企业级中后台开源解决方案汇总

企业级中后台开源解决方案汇总 * 一、Vue3 + TS 主流方案(推荐新项目) * 详细描述 * 二、Vue2 经典方案(适合老项目/兼容场景) * 详细描述 * 1. Ant Design Vue Pro (Vue2) * 2. vue-element-admin 从事中后台开发多年,经常会被团队伙伴问及“有哪些靠谱的开源解决方案可以直接复用”“不同技术栈该选哪种模板”。之前我梳理过字节、蚂蚁、腾讯等大厂的开源方案,后续又补充了多款主流框架,今天就把所有内容系统整合起来,按技术栈分类,每款方案都附上核心信息、详细介绍及关键链接,方便自己后续查阅,也希望能帮到有需要的同行。 一、Vue3 + TS 主流方案(推荐新项目) 名称核心技术栈亮点Arco Design Pro VueVue3 + TS + Vite + Arco Design字节出品,TS 全覆盖,

Ceru Music(推荐项目 桌面音乐播放器)开源

Ceru Music(推荐项目 桌面音乐播放器)开源

Ceru Music(推荐项目 桌面音乐播放器)开源 项目备份 「09  Ceru Music(桌面音乐播放器)开源」 /~fb243Lr1XM~:/ 链接:https://pan.quark.cn/s/888783ba993f Ceru Music 是基于 Electron 和 Vue 开发的跨平台桌面音乐播放器工具,借鉴洛雪音乐插件思想,提供插件运行框架与播放功能,不直接存储、提供任何音乐源文件。用户需通过自行选择、安装合规插件获取音乐相关数据,项目旨在为开发者提供桌面应用技术实践与学习案例,为用户提供合规的音乐播放工具框架。 技术栈 Electron:用于构建跨平台桌面应用Vue 3:前端框架,提供响应式 UITypeScript:增强代码可维护性和类型安全Pinia:状态管理工具Vite:快速的前端构建工具CeruPlugins:音乐插件运行环境(仅提供框架,不包含默认插件)项目结构主要功能 提供插件加载与管理功能,支持通过合规插件获取公开音乐信息支持通过插件获取歌词、

常见的代码托管平台对比分析:极狐GitLab vs GitLab vs GitHub vs Gitee

常见的代码托管平台对比分析:极狐GitLab vs GitLab vs GitHub vs Gitee

极狐GitLab、GitLab、GitHub、Gitee 是市面上常见的与代码托管有关的平台,适用于不同的开发场景和组织需求。那么,这四种产品具体有何差异?应该如何选择? 本文将从产品背景、功能特性、部署支持及生态集成等多个维度,对其进行对比分析,以帮助您更清晰地理解各个平台的优势与适用场景,从而选择更适合的代码托管方案。 背景介绍  这四个产品的发展历史各不相同: * GitHub 历史最长,在 2008 年上线 [1] ; * GitLab 其次,在 2011 年上线 [2] ; * 接下来是 Gitee,于 2013 年推出 [3] ; * 最后是极狐GitLab,成立于 2021 年 3 月 18 日 [4] 。 四种产品的发展简史如下图所示: GitHub、Gitee、极狐GitLab发展史 产品定位  * GitLab: