分治—快速选择算法

在这里插入图片描述

文章目录

    • 🍇215.数组中的第K个最大元素
      • 🍈1. 题目
      • 🍉2. 算法原理
      • 🍊3. 代码实现
    • 🍋LCR 159. 库存管理 III
      • 🍌1. 题目
      • 🍍2. 算法原理
      • 🥭代码实现

🍇215.数组中的第K个最大元素

🍈1. 题目

题目链接:215. 数组中的第K个最大元素 - 力扣(LeetCode)

给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

🍉2. 算法原理

解法一:优先级队列(堆)

一般看到第k个什么什么元素,基本都是采用堆来解决,STL里面内置了堆,也就是priority_queue优先级队列,如果是竞赛或者是考试,可以直接用,如果是平时训练,可以自己手搓一个出来。

解法二:快速选择算法(快排)

快速选择算法是基于快排的

快排的核心思路:从数组里面随机选择一个基准元素,将数组分为三部分,即:>key==key<key

将数组分为三个区域之后,我们只需要看这个第k大的元素落在哪个区间即可,那如何确定第k大的元素在哪个区域,也是三种情况:

  • 设左边区间的元素个数为a个,中间区域的元素为b个,右边区间的元素个数为c

    1. c >= k,又区间都是大元素,我们看看有几个大元素,就能知道,第k个是不是在这个区间内,即[right,l]
    2. 当第一个条件不成立时,我们去中间区域找,也就是b+c >= k,在这个区域直接返回即可
    3. 上述两个条件都不成立的情况下,那我们只能去左侧区域[l,left]寻找,这时候要找的就是第k-b-c大的元素了

    image-20231203082854930

🍊3. 代码实现

堆:

class Solution {
public:int findKthLargest(vector<int>& nums, int k){int n = nums.size();buildMaxHeap(nums, n);for(int i=0;i<k-1;i++){swap(nums[0],nums[n-1-i]);Adjustdown(nums,n-1-i,0);}return nums[0];}void buildMaxHeap(vector<int>& nums , int sz){for(int i = (sz - 1 -1)/2; i>=0; i--){Adjustdown(nums,sz,i);}}void Adjustdown(vector<int>& nums, int sz, int parent){int child = parent*2+1;	//默认左孩子大while(child<sz){if(child+1 < sz && nums[child] < nums[child+1]){child++;}if(nums[child] >nums[parent]){swap(nums[child],nums[parent]);parent = child;child = parent*2+1;}else    break;}}
};

快速选择:

class Solution {
public:int findKthLargest(vector<int>& nums, int k){srand(time(NULL));return quickSort(nums,0,nums.size()-1,k);}int quickSort(vector<int>& nums, int l, int r, int k){if(l == r)  return nums[l];int key = getRandom(nums, l, r);//数组分为三部分int i = l, left = l-1, right = r+1;while(i<right){if(nums[i] < key)   swap(nums[++left],nums[i++]);else if(nums[i] > key)  swap(nums[--right],nums[i]);else    i++;}//查看k在哪个区间int c = r - right + 1,b = right - left -1;if(c >= k)  return quickSort(nums,right,r,k);else if(b+c >= k)   return key;else    return quickSort(nums,l,left,k-b-c);}int getRandom(vector<int>& nums, int l, int r){return nums[rand()%(r - l + 1) + l];}
};

运行结果:

image-20231203085517953

🍋LCR 159. 库存管理 III

🍌1. 题目

题目链接:LCR 159. 库存管理 III

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1:

输入:stock = [2,5,7,4], cnt = 1
输出:[2]

示例 2:

输入:stock = [0,2,3,6], cnt = 2
输出:[0,2][2,0]

提示:

  • 0 <= cnt <= stock.length <= 10000
  • 0 <= stock[i] <= 10000

🍍2. 算法原理

这题就和上面这题差不多,这个是求最小的几个元素,顺序不限,解法很多

解法一:排序

直接排升序,然后返回前k个元素即可,时间复杂度O(N*logN)

解法二:堆

建一个大小为k的大根堆,将数据丢进这个堆,最后堆里面的元素就是我们要找的元素,时间复杂度O(N*logK)

详情可以看此篇文章数据结构——二叉树的3.3Top-K内容

解法三:快速选择算法

依旧是快排的核心思想:选取基准元素+数组分三块,时间复杂度为O(N)

还是这张图:

image-20231203092709344

🥭代码实现

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt){srand(time(NULL));quickSort(stock, 0, stock.size()-1, cnt);return {stock.begin(),stock.begin()+cnt};}void quickSort(vector<int>& nums ,int l, int r, int k){if(l >= r)  return;int key = getRandom(nums,l,r);int left = l-1,right = r+1,i = l;while(i<right){if(nums[i] < key)   swap(nums[++left],nums[i++]);else if(nums[i] > key)  swap(nums[--right],nums[i]);else    i++;}//[l,left] [left+1,right-1] [right,r]int a = left - l + 1,b = right - left - 1;if(a > k)   quickSort(nums,l,left,k);else if(a+b >= k)    return;else    quickSort(nums,right,r,k-a-b);}int getRandom(vector<int>&  nums, int l, int r){return nums[rand() % (r-l+1) + l];}
};

运行结果:

image-20231203093923751

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

损失函数代价函数

代价函数&#xff08;Cost Function&#xff09;和损失函数&#xff08;Loss Function&#xff09;是深度学习中两个相关但不完全相同的概念&#xff0c;它们用于衡量模型的性能&#xff0c;并在训练过程中进行参数优化。尽管经常被混用&#xff0c;但在一些文献中也有区别对待…

强推六款满分AI写作工具,需要自取

&#x1f517; 运行环境&#xff1a;ChatGPT &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

31-WEB漏洞-文件操作之文件包含漏洞全解

31-WEB漏洞-文件操作之文件包含漏洞全解 一、本地包含1.1、无限制包含漏洞文件1.2、有限制包含漏洞文件1.2.1、绕过方法1.2.1.1、%00截断1.2.1.2、长度截断 二、远程包含2.1、无限制包含漏洞文件2.2、有限制包含漏洞文件 三、各种协议流提交流3.1、各协议的利用条件和方法3.1.1…

克服.360勒索病毒:.360勒索病毒的解密和预防

导言: 在数字化的今天&#xff0c;数据安全问题变得愈发棘手。.360勒索病毒是当前网络空间的一场潜在灾难&#xff0c;对于这个威胁&#xff0c;了解应对之道和采取切实的预防措施至关重要。如果您正在经历勒索病毒的困境&#xff0c;欢迎联系我们的vx技术服务号&#xff08;s…

洛谷 P5711 闰年判断 C++代码

目录 前言 思路点拨 AC代码 结尾 前言 今天我们来做洛谷上的一道题目。 网址&#xff1a;【深基3.例3】闰年判断 - 洛谷 题目&#xff1a; 思路点拨 首先题目让我们输入一个年份&#xff0c;因此我们需要定义一个变量year&#xff0c;来存储输入的年份&#xff1a; in…

回归分析:预测和建模

回归分析:预测和建模 写在开头1. 回归分析的基本概念2. 回归分析的方法2.1 简单线性回归2.1.1 数学知识2.1.2 应用举例2.2 多元线性回归2.2.1 数学公式和应用2.2.1 应用场景举例2.3 多项式回归2.3.1 数学公式和应用2.3.2 应用场景举例2.4 逻辑回归2.4.1 数学公式和应用2.4.2 应…

matlab科学计算

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

如何进行卷积特征可视化

大家好啊&#xff0c;我是董董灿。 之前写过很多关于卷积算法的文章&#xff1a;5分钟理解什么是卷积的特征提取。总的来说&#xff0c;卷积算法的本质是一个特征提取器。 那么既然卷积神经网络在图像分类、图像检测、图像分割以及其他领域有这么好的表现&#xff0c;卷积到底…

【动手学深度学习】(六)权重衰退

文章目录 一、理论知识二、代码实现2.1从零开始实现2.2简洁实现 【相关总结】 主要解决过拟合 一、理论知识 1、使用均方范数作为硬性限制&#xff08;不常用&#xff09; 通过限制参数值的选择范围来控制模型容量 通常不限制偏移b 小的意味着更强的正则项 使用均方范数作为柔…

多项式拟合求解

目录 简介 基本原理 例1 例2 例3 参考资料 简介 多项式拟合可以用最小二乘求解&#xff0c;不管是一元高阶函数&#xff0c;还是多元多项式函数&#xff0c;还是二者的混合&#xff0c;都可以通过统一的方法求解。当然除了最小二乘法&#xff0c;还是其他方法可以求解&…

极兔速递查询,极兔速递单号查询,根据更新量筛选出来需要的单号

批量查询极兔速递单号的物流信息&#xff0c;并根据物流更新量将需要的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

express搭建后台node接口

在前端的学习中我们使用express来开发接口结合mysql&#xff0c;然后使用可视化的数据库工具来操作数据&#xff0c; web框架是express 文档是jsdoc swagger 数据库模型是sequelize 部署使用PM2来上服务器&#xff0c; 打包你也可以结合webpack配置target node状态 当然你也可以…

糟了,数据库崩了,又好像没崩

前言 2023 年某一天周末&#xff0c;新手程序员小明因为领导安排的一个活来到公司加班&#xff0c;小明三下五除二&#xff0c;按照领导要求写了一个跑批的数据落库任务在测试环境执行 &#xff0c;突然间公司停电了&#xff0c;小明大惊&#xff0c;“糟了&#xff0c;MySQL …

cc-product-waterfall仿天猫、淘宝购物车店铺商品列表组件

cc-product-waterfall仿天猫、淘宝购物车店铺商品列表组件 引言 在电商应用中&#xff0c;购物车体验的优化对于提升用户满意度和转化率至关重要。在本文中&#xff0c;我们将深入探讨如何使用cc-product-waterfall组件&#xff0c;结合uni-number-box和xg-widget&#xff0c;…

软著项目推荐 深度学习手势识别算法实现 - opencv python

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习手势识别算法实现 - opencv python 该项目较为新颖…

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL&#xff08;数字用户线&#xff09;6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

FL Studio 21.2.1.3859中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#xff0c;而且F…

WebGL笔记:矩阵平移的数学原理和实现

矩阵平移的数学原理 让向量OA位移 x方向&#xff0c;txy方向&#xff0c;tyz方向&#xff0c;tz 最终得到向量OB 矩阵平移的应用 再比如我要让顶点的x移动0.1&#xff0c;y移动0.2&#xff0c;z移动0.3 1 &#xff09;顶点着色器核心代码 <script id"vertexShader&…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时&#xff0c;我们说完Vue响应式原理&#xff0c;或者Vue2和Vue3的区别时&#xff0c;通常会引出Vue3使用了Proxy来优化响应式&#xff0c;而面试官会继续深挖&#xff1a;说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

带头双向循环链表:一种高效的数据结构

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…