【算法:贪心】:贪心算法介绍+基础题(四个步骤);柠檬水找零(交换论证法)

embedded/2024/10/9 15:16:04/

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

前言:

暑假马上就要留校学习算法了,现在先学习一下基本的算法打打基础。本篇要讲的是贪心算法的介绍,然后会讲两道基础的题目,用的贪心证明方法是:交换论证法。目前对贪心算法还是很感兴趣的,贪心没有固定的解法,遇到不会的,希望我可以把这种贪心算法搞清楚。

贪心算法

🍩1.概念:

贪心算法是把问题分成很多步,每次都是选择看起来最优的那一步,就可以得到正确的答案。能用贪心解决的问题是具有贪心性质的。要想能用贪心解题,需要充分挖掘题目的条件。而且没有固定的模式。

🍩2.步骤:

对于一道贪心题,要解决并学会,可以分为:

1.题目解析。2.算法原理。3.手撕代码。4.贪心策略证明。

对于一道贪心题,可能前三步很简单,但是第四步一定是可以多多思考,多多证明的。在证明贪心策略的过程也是很有趣的。

🍩3.对于学习贪心算法建议:

贪心算法,没有一个固定的模式,我不是孙膑。我更多是去学习别人的贪心方法,并理解运用。所以在遇到有一些贪心问题的时候,我们可能没有任何思路,但是我们可以看别人的贪心解法,然后学习别人的思路。能把别人想出来的东西运用,也是一节伟大事情。

例题1

LeetCode:柠檬水找零(860)

860. 柠檬水找零 - 力扣(LeetCode)

🍩1.题目解析:

●每杯柠檬水售价5元。

●顾客排队购买。

●顾客向你付给你的钞票面额:5元,10元,20元。对于10元的,要找一张五块钱。对于20元的,你可以找三张五块钱,也可以找一张五块钱和一张十块钱。

●一开始没有零钱,也就是只能有顾客的钱来找零。

🍩2.算法原理:

1.对于顾客给的五块钱,我们直接收下,不需要找零。


2.对于顾客付的十块钱,我们将十块钱收下,然后进行找五块钱。


3.对于顾客付的二十块钱,我们有两种找零的方式。

找零一:找三张五块钱的。

找零二:找一张十块钱的, 找一张五块钱的。

🚁🚁🚁

从上面三种情况来看,五块钱有两种用途,十块钱只有一种用途(十块钱只能用来找零二十块钱的)。贪心解的情况下就是在找零二十块钱的时候,如果有十块钱就先用十块钱找(即找零方法一)。如果没有十块钱,才用三张五块钱进行找零。

🍩3.手斯代码:

class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five=0,ten=0;   //20元有和没有都没关系for(auto& i:bills){if(i==5)++five;else if(i==10){if(five){--five;++ten;}elsereturn false;}else if(i==20){//有十块钱时,先用十块钱if(ten&&five){--ten;--five;}else if(five>=3){five-=3;}elsereturn false;}}return true;}
};

🍩4.证明贪心策略:

在这道题中,贪心解和正确解的不同只发生在找零二十块钱的时候,贪心解用十块钱和五块钱进行找零,正确解用三张五块钱的进行找零。

🎡情况一:对于贪心解中用的十块钱,如果后面我们没有在正确解中用这十块钱,就直接用十块钱替换正确解的两种五块钱就得到了贪心解。

🎡情况二:如果后面正确解要用贪心解里的十块钱,那么此时用两张五块钱进行替换,也是满足最优性质的。


http://www.ppmy.cn/embedded/56416.html

相关文章

Python酷库之旅-第三方库Pandas(003)

目录 一、用法精讲 4、pandas.read_csv函数 4-1、语法 4-2、参数 4-3、功能 4-4、返回值 4-5、说明 4-6、用法 4-6-1、创建csv文件 4-6-2、代码示例 4-6-3、结果输出 二、推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、Python魔法之旅 …

【yolov8系列】ubuntu上yolov8的开启训练的简单记录

前言 yolov8的广泛使用&#xff0c;拉取yolov8源码工程&#xff0c;然后配置环境后直接运行&#xff0c;初步验证自己数据的检测效果&#xff0c;在数据集准备OK的情况下 需要信手拈来&#xff0c;以保证开发过程的高效进行。 本篇博客更注意为了方便自己使用时参考。顺便也记录…

Oracle中CREATE FORCE VIEW的说明和例子

Oracle数据库中的CREATE FORCE VIEW语句用于创建视图&#xff0c;即使在视图所依赖的基表或对象不存在&#xff0c;或者创建视图的用户对这些对象没有足够的权限时&#xff0c;也能强制创建视图。不过&#xff0c;需要明确的是&#xff0c;尽管视图能被强制创建&#xff0c;但在…

数学建模----滑翔伞伞翼面积的设计及运动状态描述

摘要 滑翔伞作为一项融合了挑战、冒险和刺激于一体的运动&#xff0c;近年来在全球范围内受到了广泛的关注。滑翔伞在救援、探险、体育、娱乐、环保和交通等领域的应用展现了其重要价值。然而&#xff0c;中国在滑翔伞领域尚未取得突破&#xff0c;缺乏全球影响力和竞争力。因此…

【selenium 】操作元素

操作元素 元素操作鼠标操作键盘操作 元素操作 元素操作示例清空输入框clear()deiver.find_element_by_id(“username”).clear()输入文字send_keys()deiver.find_element_by_id(“username”).send_keys(‘zs’)元素点击 click()deiver.find_element_by_id(“login”).click()…

LRU Cache 双向链表以及STL list实现----面试常考

双向链表版本&#xff1a; #include <bits/stdc.h> using namespace std; struct Node{int key, value;Node* prev;Node* next;Node():key(0), value(0), prev(nullptr), next(nullptr){}Node(int k, int v):key(k), value(v), prev(nullptr), next(nullptr){} }; class…

Unreal Engine@Jetson Orin Nano尚不支持

Unreal EngineJetson Orin Nano尚不支持 1. 源由2. Unreal Engine介绍3. 问题4. 编译方法5. 补充6. 其他 1. 源由 最近在看SC-Explorer方面的内容&#xff0c;在模拟方面采用了Unreal Engine。 本打算跑下模拟&#xff0c;因此打算在JetsonOrin的板子上试试看。 2. Unreal En…

【进阶篇-Day6:JAVA中Arrays工具类、排序算法、正则表达式的介绍】

目录 1、Arrays工具类2、排序算法2.1 冒泡排序2.2 选择排序2.3 二分查找&#xff08;折半查找&#xff09;&#xff08;1&#xff09;概念&#xff1a;&#xff08;2&#xff09;步骤&#xff1a; 3、正则表达式3.1 正则表达式的概念&#xff1a;3.2 正则表达式的格式&#xff…