算法训练之贪心
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥
♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥
♥♥♥我们一起努力成为更好的自己~♥♥♥
♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥
♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥
✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨
在前面的博客中,我们已经学习了部分算法思路,可以解决一些问题了,这一篇博客我们来展开一个新的算法思想——贪心,准备好了吗~我们发车去探索奥秘啦~🚗🚗🚗🚗🚗🚗
目录
前置知识
什么是贪心算法?
举例
找零钱问题
最小路径和问题
贪心算法的特点
柠檬水找零
将数组和减半的最小操作数
priority_queue
核心特性
常用操作
前置知识
在真正开始贪心算法题目练习之前,我们首先要了解什么是贪心算法?贪心算法有什么特点?
什么是贪心算法?
我们可以用一句话来概括:贪婪+鼠目寸光
贪心策略: 解决问题的策略,由局部最优——>全局最优
具体步骤:
1.把解决问题的过程分为若干步;
2.解决每一步的时候,都选择当前看起来"最优的"解法;(鼠目寸光)
3."希望"得到全局最优解。(不一定就是最优解)
光光看这些步骤会有一点抽象,我们来结合具体例子来看~
举例
找零钱问题
将要解决的问题分为几步,从最大的面值开始计算,找当前花的最少张数,显然答案是正确的,后续我们会进行证明~
最小路径和问题
在前面动态规划我们提到过这个问题,这一次我们试一下使用贪心算法可不可以解决~
从左上角开始,我们每一步都按当前位置的最优选择(局部最优解)进行,但是不难发现结果是错误的~所以我们是"希望"得到全局最优解,但是结果不一定近人意,我们就需要更改我们的贪心策略~
贪心算法的特点
结合前面的例子,我们可以发现贪心算法有下面的特点:
一、贪心策略的提出
1.贪心策略的提出是没有标准以及模板的2.可能每一道题的贪心策略都是不同的
二、贪心策略的正确性
"贪心策略"可能是一个错误的方法;正确的贪心策略,我们是需要"证明的"。常用的证明的方法:数学中见过的所有证明方法
接下来,我们就来证明找零钱问题贪心策略的正确性:
我们首先假设最优解得到的面值为20、10、5、1的张数分别为A、B、C、D,我们首先来看看它们的特点/性质:
相同的分析可以得到B、C、D满足B<=1,C<=1,D<=4
我们继续来看,假设贪心算法得到的面值为20、10、5、1的张数分别为a、b、c、d~
既然最优解是最少的张数的话,那么我们显然a>=A的,那么我们来分析一下a>A的情况,a大于A说明还有20需要其他面值凑出来,但是B、C、D满足B<=1,C<=1,D<=4,所以最多就是19,不能凑出来20,那么就说明a==A,同理可以得到b==B,c==C,d==D,所以最优解的答案和贪心得到的答案是一样的,那么也就说明是正确的~
因此,正确的贪心策略,我们是需要"证明的",证明结果正确才代表贪心策略正确,证明贪心策略不正确,只需要举一个反例,那么这个时候就需要我们对贪心策略进行调整了~
有了前面的这些小知识点,接下来,我们就来在题目中进行实际应用贪心算法~
柠檬水找零
柠檬水找零
这个题目告诉了我们一杯柠檬水5美元,顾客可能给5美元/10美元/20美元,最开始我们手上没有任何的美元,这也就说明我们只能利用顾客给我们的钱进行找零~并且顾客是排队购买的,必须成功找了零钱才能继续收下一个顾客的钱~
我们来进行分类讨论:
1、如果顾客给的钱是5美元——直接收下
2、如果顾客给的钱是10美元——需要找5美元
3、如果顾客给的钱是20美元——需要找15美元(这里的十五美元就有两种选择了)
①10 + 5 ②5 + 5 + 5
我们主要来分析一下第三种情况,我们优先选择第一种还是第二种呢?
答案是第一种,我们不难发现5美元是有很大用处的,10美元可以找,20美元也可以找,结合我们的生活经验,我们应该尽可能的保留5美元~这里就体现了我们贪心思想,优先选择当前情况下的最优解,最终得到全局的最优解~
有了前面的分析,这道题目的代码实现就比较简单了~
代码实现:
//柠檬水找零
class Solution
{
public:bool lemonadeChange(vector<int>& bills){int n = bills.size();int five = 0, ten = 0;//统计可以找的钱for (auto x : bills){if (x == 5)//是5元直接收下{five++;}else if (x == 10)//10元需要找5元{//判断是否有五元if (five){five--;ten++;}elsereturn false;}else//20元需要找15元{//贪心思想//优先10+5if (five && ten){five--;ten--;}//其次5+5+5else if (five >= 3){five -= 3;}//找不了就return falseelsereturn false;}}return true;}
};
顺利通过~
将数组和减半的最小操作数
将数组和减半的最小操作数
题目要求是比较简单的,我们这里就直接来说一下我们的贪心策略:
贪心策略:
每一次找到数组中最大的数(我们可以使用大根堆)进行减半操作,再把减半的数重新放入数组中,重复操作,找到整个数组和减少一半为止~
贪心策略知道了,代码实现也就更加简单了~
代码实现:
class Solution
{
public:int halveArray(vector<int>& nums){//使用大根堆——每次找到最大值减少一半int n = nums.size();//减半之后可能是小数,使用double存储priority_queue<double> heap;//插入数据+统计数组和double sum = 0;for (auto e : nums){heap.push(e);sum += e;}sum /= 2.0;//和先除2int count = 0;//计数while (sum > 0)//当减半和>0,进入循环{//找到堆顶元素减少一半重新插入double tmp = heap.top() / 2;heap.pop();sum -= tmp;heap.push(tmp);count++;}return count;}
};
顺利通过~接下来对我们的贪心策略进行简单的证明~
交换论证法证明:
贪心解选择的数据:A 、B 、C 、D 、E.....x....
最优解选择的数据:a 、 b 、c 、 d、 e......y...
贪心解每一次都是选择最大的数进行减半操作,那么说明贪心解选择的数据 >= 最优解选择的数据,数据相同的情况,我们就不需要处理了,如果说贪心解选择的数据(x)>最优解选择的数据(y)——分情况讨论
1、如果这个数据没有使用过,因为x > y,那么把最优解里面的数据y替换成x,肯定是可以达到数组和减少一半的操作的
2、如果这个数据使用过了,我们也可以把最优解里面的数据y替换成x,只不过更改一下顺序就可以了
最终进行不断地替换完成之后,我们不难发现贪心解和最优解选择的数据个数是相等的,也就是我们想要的结果~
证明结束~
此外,这一篇文章提到的priority_queue也在这里进行简单介绍
priority_queue
priority_queue
(优先队列)是一个基于堆(Heap)结构的容器适配器,用于高效管理元素的优先级。以下是关键点介绍:
核心特性
- 默认最大堆:默认使用大顶堆(最大元素在队首),可通过比较函数改为小顶堆。
- 默认大顶堆:
priority_queue<int> pqmax;
- 小顶堆:
priority_queue<int, vector<int>, greater<int>> pqmin;
- 高效操作:插入(
push
)和删除(pop
)的时间复杂度为 O(log n),访问队首元素(top
)为 O(1) - 不支持遍历:内部通过堆实现,直接遍历无法得到有序序列。
常用操作
- 插入元素:
pq.push(value);
- 删除队首:
pq.pop();
- 访问队首:
int top = pq.top();
- 判空:
pq.empty()
- 大小:
pq.size()
如果想了解更加具体的可以访问cplusplus——priority_queue
♥♥♥本篇博客内容结束,期待与各位优秀程序员交流,有什么问题请私信♥♥♥
♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥
✨✨✨✨✨✨个人主页✨✨✨✨✨✨
相关文章:
算法训练之贪心
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
ThreeJs实现裸眼3D地球仪
一、实现效果 使用Three.js实现裸眼3D地球仪 二、实现代码 代码如下: <!DOCTYPE html> <html> <head><title>3D Earth</title><style>body { margin: 0; }canvas { display: block; }</style> </head> <body…...
0x07.Redis 的 hash 是什么?
回答重点: Redis 的 Hash 是一种键值对集合,允许将多个字段与其对应的值存储在同一个键中,从而方便管理和操作关联数据。它的主要特点包括: 高效存储:Hash 采用哈希表实现,能够在内存中高效地存储和操作小规模的数据集,非常适合存储对象的属性。快速操作:支持对字段的…...
今日一记:逆序打印字符、五人年龄计算、对N个数排序
今日进行三道题的练习 题目一:逆序打印字符 核心需求:将输入的n个字符以相反顺序输出。 算法分析: 递归思想: 递归函数先读取字符,直到输入结束(如换行符或EOF)。 在递归返回时打印字符&…...
【笔记】对抗训练-GAN
对抗训练-GAN 深度学习中 GAN 的对抗目标函数详解与最优解推导一、GAN 的基本对抗目标函数二、判别器与生成器的博弈目标三、判别器的最优解推导四、最优判别器的含义五、总结六、WGAN 的动机(为后续铺垫) 深度学习中 GAN 的对抗目标函数详解与最优解推导…...
Python六大数据类型与可变类型
数字类型包括整型(int),浮点型(float),布尔型(bool),复数型(complex)。整型只能存储整数,浮点型可以存储整数和小数,布尔型…...
回溯-day65
回溯 什莫事回溯 回溯法也可以叫做回溯搜索法,它是一种搜索的方式 回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本…...
(2)VTK C++开发示例 --- 绘制多面锥体
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 VTK C开发示例程序; 使用C 和VTK绘制一个多面锥体。 环境说明系统ubuntu22.04、windows11cmake3.22、3.2…...
合同智能审核技术的发展与应用
一、背景与行业现状 合同审查作为企业合同管理的关键环节,其核心价值在于确保合同内容符合法律法规要求并契合企业内部政策。随着企业业务规模扩张带来的合同数量激增,传统人工审查方式在效率和成本方面的局限性日益凸显。这一现状为人工智能技术在合同…...
cryptozombies合约7
我们的合约几乎就要完成了!让我们加上一个事件. 事件 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。 例子: // 这里建立事件 event IntegersAdded(uint x, uint y, uint result);function add(uint _x, uint _y) public…...
DeepSeek 接入 Word 完整教程
一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台: 打开浏览器,访问 DeepSeek 官方网站(或您使用的相应平台)。注册并登录您的账户。 创建 API 密钥: 在用户控制面板中,找到“API Keys”或“API…...
ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量
利用两期地表DEM数据计算工程土方量需要准许以下数据: 当前地图有3个图层,两个栅格图层和一个矢量图层 两个栅格图层:beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层…...
大数据学习栈记——Redis安装及其使用
本文介绍NoSQL技术:Redis的安装及其使用。操作系统:Ubuntu24.04 Redis介绍 Redis是一个键值(key-value)存储系统,即键值对非关系型数据库,和Memcached类似,目前正在被越来越多的互联网公司采用…...
前端工程化之自动化构建
自动化构建 自动化构建的基本知识历史云构建 和 自动化构建 的区别:部署环境:构建:构建产物构建和打包的性能优化页面加载优化构建速度优化 DevOps原则反馈的技术实践 encode-bundlepackage.json解读src/cli-default.tssrc/cli-node.tssrc/cl…...
camx的xml解析
ls out/target/product/<product>/gen/STATIC_LIBRARIES/libcamxgenerated_intermediates/generated g_chromatix g_facedetection g_parser g_sensorg_chromatix/ tuning相关xml的解析codeg_facedetection/ 人脸检测相关xml的解析codeg_parser/ 主要的解析manager 流…...
虚幻引擎 Anim To Tex| RVT | RT
本文上篇分为4个部分:动画驱动材质,虚拟纹理,Rendertarget,以及其他杂项的地编ta干货整理。(其中RT部分基本为UOD重要截图摘录) 本文下篇为:skylight和directional light的区别,未完…...
计算机视觉与深度学习 | 钢筋捆数识别
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 钢筋捆数 1、初始结果2、处理效果不佳时的改进方法1、预处理增强2、后…...
关于PHP开源CMS系统ModStart的详细介绍及使用指南
关于PHP开源CMS系统ModStart的详细介绍及使用指南: 🔍 ModStart是什么? 基于Laravel框架开发的模块化CMS系统采用Apache 2.0 开源协议,完全免费可商用特别适合需要快速搭建企业级网站/管理系统的开发者 🚀 核心优势…...
VMware vCenter Server 安全漏洞升级方案一则
一、安全漏洞情况 根据VMware提供的安全建议(VMSA-024-0012),VMware vCenter Server可能经受以下漏洞的威胁: 漏洞一为VMware vCenter Server堆溢出漏洞(CVE-2024-37079,CVE-2024-37080)&…...
Linux服务之网络共享
目录 一.存储类型 二.NFS 2.1定义 2.2工作原理 2.3优势 2.4NFS工具 2.4.1exportfs 2.4.2showmount 2.5NFS相关软件及命令 2.6模拟实现NFS 准备工作(服务端和客户端都需要) 服务端位置 客户端配置 测试 补充:设置自动挂载 一.存…...
接口幂等性问题
幂等性问题出现在创建和更新数据时: 一、创建 1、在创建数据时,数据库方面,创建有效的唯一索引,用来数据兜底,并在程序中做异常捕获。 2、在插入数据时可以创建一个防重表做过滤,如果防重数据比较小又需…...
LeetCode每日一题4.14
1534. 统计好三元组 问题分析 遍历数组,满足好三元组定义,count1 思路 枚举i,j,k 代码 class Solution:def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:n len(arr)count 0for i in range…...
活动安排问题 之 前缀和与差分
文章目录 D. Robert Hood and Mrs Hood 考虑到一个活动开始时间和结束时间s,e,那么可以影响到的范围就是 s-d1,e,所以我们只需对这个每一个活动可以影响到的区域进行标记即可,当然为了降低时间复杂度,我们将使用前缀和与差分 t int(input()…...
HTTP 和 HTTPS 协议的区别及使用场景
在互联网的世界里,HTTP 和 HTTPS 是我们经常接触到的两种网络协议,它们在数据传输、安全性等方面存在诸多差异,适用的场景也各有不同。 一、HTTP 和 HTTPS 的基本概念 HTTP,即超文本传输协议(Hyper - Text Transfer Protocol),是一种用于分布式、协作式和超媒体信息…...
SAP 供应链:采购订单ME21N创建关键点
一、ME21N创建采购订单关键点 采购组织/采购组 字段:EKORG(采购组织)、EKGRP(采购组)关键点:采购组织必须与公司代码(Company Code)关联,采购组对应采购员职责范围示例&…...
重构无人机动力控制范式:Breeze 55A FOC 电调技术深度测评 ——全新Vfast 观测器如何突破效率与精度双重瓶颈
一、引言 在无人机动力系统中,电调(电子调速器)作为连接电池与电机的核心枢纽,其控制精度、效率及可靠性直接影响飞行性能。南昌长空科技的Breeze 55A FOC 电调凭借全新 Vfast 观测器技术与成熟的 FOC(矢量控制&#…...
LLM做逻辑推理题-哪一项圈出后不用找零
题目: 某天,两男两女走进一家自助餐厅,每人从机器上取下一许如下图所示的标价单。 50、95 45、90 40、85 35、80 30、75 25、70 20、65 15、60 10、55 (1)四人要同样的食品…...
第十章 json操作
第十章 json操作 文章目录 第十章 json操作一、Marshal 序列化二、Unmarshal 反序列化1 已知数据解析2 未知数据解析3 json测试 一、Marshal 序列化 package mainimport ("encoding/json""fmt" ) type Animal struct {Name string json:"name"…...
Python-Django集成yolov识别模型摄像头人数监控网页前后端分离
程序示例精选 Python-Django集成yolov识别模型摄像头人数监控网页前后端分离 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《Python-Django集成yolov识别模型摄像头人数监控网页前后端分离…...
「出海匠」借助CloudPilot AI实现AWS降本60%,支撑AI电商高速增长
🔎公司简介 「出海匠」(chuhaijiang.com)是「数绘星云」公司打造的社交内容电商服务平台,专注于为跨境生态参与者提供数据支持与智能化工作流。平台基于大数据与 AI 技术,帮助商家精准分析市场趋势、优化运营策略&…...
tsconfig.json配置不生效
说明一下我遇到的问题,这是我的配置文件代码的 {"compilerOptions": {"module": "none","target": "ES5","outFile": "./dist/bundle.js"} } 和我想象不同的是,我编译成 js 没…...
WebFlux应用中获取x-www-form-urlencoded数据的六种方法
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
GPT4O画图玩法案例,不降智,非dalle
网址如下: 玩法1:吉卜力(最火爆) 提示词:请将附件图片转化为「吉卜力」风格,尺寸不变 玩法2:真人绘制 提示词:创作一张图片,比例4:3,一个20岁的中国女孩…...
【Python爬虫】简单案例介绍1
目录 三、Python爬虫的简单案例 3.1 网页分析 单页 三、Python爬虫的简单案例 本节以科普中国网站为例。 3.1 网页分析 单页 在运用 Python 进行爬虫开发时,一套严谨且有序的流程是确保数据获取高效、准确的关键。首先,深入分析单个页面的页面结构…...
【CAPL实战:以太网】MAC地址由整数形式转换为字符串形式的自定义函数
我在文章MAC地址在字符串形式、数字形式和byte数组中的转换中讲过MAC地址在字符串形式、数字形式和byte数组中的转换方法和思想。如果你仔细阅读过这篇文章,那么MAC地址的形式要如何转换,自定义函数要如何实现它肯定也能信手拈来。如果你还不会也没有关系,今天我们尝试用另一…...
#4 我们为什么使用物联网? 以及 物联网的整体结构
设备不物联是否可以? 答案 是可以的,从项目实战的角度,还是有很多包括分拣,控制,检测等应用是分立的,这个和成本,场景,客户接受度等因素有关。 局部看,一些系统的确很简…...
MQTT、HTTP短轮询、HTTP长轮询、WebSocket
一、协议“明星定位”仿写 MQTT:物联网领域的**“明星协议”**,专为低带宽、高延迟网络环境下的设备通信而生。HTTP短轮询:数据拉取界的**“劳模”**,用简单粗暴的频繁请求换取数据更新。HTTP长轮询:短轮询的**“智能…...
Apache Commons CLI 入门教程:轻松解析命令行参数
文章目录 Apache Commons CLI 入门教程:轻松解析命令行参数一、什么是 Commons CLI?二、为什么选择 Commons CLI?三、快速开始1. 添加依赖2. 基础示例3. 运行示例1. 在Idea中运行2. 命令行中运行3. 使用 Maven/Gradle 运行(推荐&a…...
Kubernetes Operator 是什么,以及它们的用途
最近一个朋友问我关于EKS的升级问题: 场景: 如果我有 100 个 EKS 集群需要升级,那么所有集群都安装了安全插件。由于我不想在升级后手动在每个EKS中重复安装此插件,如何实现EKS升级后自动安装这个安全插件? 答案有多…...
SAP ABAP语言中的比较运算符
一、基本比较运算符 运算符描述关键字形式符号形式示例等于EQIF a EQ b 或 IF a b不等于NE<>IF a NE b 或 IF a <> b大于GT>IF a GT b 或 IF a > b小于LT<IF a LT b 或 IF a < b大于等于GE❌ 不支持IF a GE b小于等于LE❌ 不支持IF …...
10秒调用大模型!思源笔记+Ollama实现实时AI推理助力写作效率提升
文章目录 前言1. 下载运行Ollama框架2. Ollama下载大语言模型3. 思源笔记设置连接Ollama4. 测试笔记智能辅助写作5. 安装Cpolar工具6. 配置Ollama公网地址7. 笔记设置远程连接Ollama8. 固定Ollama公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂…...
Linux网络DFS共享服务搭建
目录 一.存储类型 1.DAS优势和局限性 2.SAN的特点及组成 3.NAS优势与局限性 二.NFS服务 1.NFS工作原理 2.NFS工具 2.1 exportfs 2.2 showmount 3.实际操作 3.1.服务器操作 3.2.客户机操作 3.3.默认无法写操作 一.存储类型 存储类型分为三种 直连式存储:…...
汇舟问卷:国外问卷调查项目
这个项目现在市面上主要有三种玩法,我给你整点实在的: 第一种:上网站直接做调查(站点查) 和国内调查网站差不多,国外也有一堆调查网站。可以直接到国外问卷网站注册账号答题。 好处是题目现成的不用自…...
JSON-RPC 2.0 vs REST API 详细对比分析
现在要开始做一个新的业务模块了,系统思考下 新的业务模式应该是采用 JSON-RPC 2.0 还是 老套路 REST API 的接口协议 ,系统的学习下 1. 基本概念 JSON-RPC 2.0 无状态的、轻量级的远程过程调用(RPC)协议使用 JSON 作为数据格式…...
Python 类方法
Python 类方法示例 类方法是绑定到类而不是实例的方法,它们使用 classmethod 装饰器定义,第一个参数通常是 cls(表示类本身)。下面是一个具体的例子: class Employee:"""员工类"""rais…...
MVC流程讲解——以文件下载为例
整体的流程是这样: 用户点击一个树节点 → 请求远程机器该目录下的文件信息 → 显示在树控件和列表控件中。 🧱 MCV 模式简介(针对这个场景) 模块代表什么主要职责Model(模型)数据结构和逻辑表示你传输的…...
深度学习之线性代数基础
2.3.7 点积 ∑按位积 2.3.8 矩阵-向量积 2.3.9 矩阵-矩阵乘法 2.3.10 范数...
某公司网络OSPF单区域配置
1.配置背景: xx公司网络由三台路由器和一台交换机组成,现在想要三台路由器之间通过OSPF实现互连互通。 2.网络结构如下: 3.具体配置: 3.1路由器 RA 配置: 1.更改主机名称: Router>en Router#conf t…...
vue+flask+GNN+neo4j图书知识图谱推荐系统
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F025 pro 架构: vueflaskneo4jmysqlpytorch 亮点:两种基于知识图谱的推荐算法(GNN和基于路径推荐&#x…...
小程序页面传值的多种方式
开发小程序,总是避免不了页面和页面之间数据共享,实现方法有很多种,以下就讲解一下小程序页面传值,需要的朋友可以参考下。 1 使用wx.navigateTo()传值 这种传值方式有两种, url后面拼接传值:需要跳转的…...