贪心算法算法,完全零基础小白教程,不是计算机的都能学会!超详解

目录

一、基本概念

二、举几个例子,便于理解

1、找零问题

2、最小路径和

3、背包问题

1)只考虑体积的贪心策略:

2) 只考虑价值的贪心策略:

三、贪心策略的特点

四、贪心策略证明

四、如何学习贪心

五、例题分析

第一题

1、题目描述

2、贪心策略分析

3、代码

 第二题

1、题目描述

2、贪心策略分析

3、代码

 第三题

1、题目描述

2、贪心策略分析

3、代码

 第四题

1、题目描述

2、贪心策略分析

3、代码


一、基本概念

什么是贪心算法?
贪心算法不是一个具体的算法,而是一个策略。
具体的策略是:
1、把解决问题的过程氛围若干步
2、解决每一步,都选择当前看起来“最优”的解法
3、最后希望得到一个全局最优解。

二、举几个例子,便于理解

1、找零问题

你是一个超市前台,你有面额为【20,10,5,1】的零钱,数量不限
有个顾客来买东西,要找零50块。
你要给他找零,要求是给的钞票数最少。
按照贪心的策略,核心是我只考虑当前步数的最优的选法。
所以,按照贪心策略,我不管三七二十一,我不管后面怎么样子,我就只管当前的情况。
所以,50块,我先找两张最大的20
剩下10块,然后找一张10块。
结束。

2、最小路径和

以下有一个表格,

每一次只能向下或者向右走,现在要求从左上角走到右下角走的路径最小。
贪心法的策略就是:我不管三七二十一,那个小,我就走那个。我不管后面怎么样子,我就只管现在这一步。
因此:

3、背包问题


假设我们有以下几种物品,每种物品有价值和体积两个属性:
物品 A:价值 10,体积 2
物品 B:价值 8,体积 3
物品 C:价值 5,体积 4
物品 D:价值 3,体积 1
背包体积为8。现在要求尽可能的装东西,体积不超过8,要求价值最大化。

1)只考虑体积的贪心策略:


贪心的策略就是:我不管你别的,那个小,我选那个。
所以我直接选了8个D,3*8 -21;
但是实际上最佳的选择是4个A,价值为40.

2) 只考虑价值的贪心策略:


别的我不管,那个价值大我放那个。
所以按照价值从大到小的顺序选择物品放入背包。
选择4个价值最大的A,总价值为40.

三、贪心策略的特点

根据上述三个简单例子的理解,我们可以总结归纳贪心策略特点如下:
1、贪心策略没有标准和模板可以套用,需要具体问题具体分析
2、贪心策略所得结果无法保证最优解(因此,需要严格证明策略的正确性)

四、贪心策略证明

常用证明方法(数学方法):
1、贪心选择性质:证明贪心算法每一步的选择都是局部最优的,即当前情况下的最佳选择,不考虑未来可能发生的情况。
2、反证法:假设贪心算法得到的解不是最优解,然后推导出这个假设的结果与实际情况不符,从而证明贪心算法得到的解必须是最优的。
3、交换证明:通过比较贪心算法选择的解和任何其他算法选择的解,证明贪心算法的解比其他算法的解更优或者至少一样好。
4、拼接法:通过将贪心算法得到的局部最优解与其他算法得到的解拼接或组合,证明贪心算法整体上是最优的。

四、如何学习贪心?

根据以上内容,我们怎么学习贪心?
1、遇到不会做的贪心题目,非常正常,非常常见。
不会就去查,就去搜,就去模仿。
先积累模仿,再总结经验,慢慢积累,找感觉。
这就够了,不要想太多。
2、其次,慢慢的,要学会自己去证明贪心策略正确性的过程。

五、例题分析

第一题

1、题目描述

860. 柠檬水找零

  在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

2、贪心策略分析

5元不用找,10元找5元,20元找一张10和一张5,而不是3张5。每一次找零都尽可能的留下5,把10兑换出去。

3、代码

class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0;for(auto e : bills){if(e == 5){five++;}else if(e == 10){if(five == 0){return false;}else{five--;ten++;}}else //20{if(ten >= 1 && five >= 1){ten--;five--;}else if(five >= 3){five -= 3;}else {return false;}}}return true;}
};

 第二题

1、题目描述

2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)

请你返回将 nums 数组和 至少 减少一半的 最少 操作数。

2、贪心策略分析

每一次选择该数组中最大数字减半,可以使用一个堆,c++中对应的容器是优先队列,priority_queue。

3、代码

class Solution {
public:int halveArray(vector<int>& nums) {//用优先队列//每一次选取top出队列,减半,再插入队列//如此保证每一次选择得数据都是最大的std::priority_queue<double> q;double sum = 0;for(auto e : nums){sum += e;q.push(e);}double count = 0;double half = sum / 2;double ret = sum ;while(!q.empty()){double top = q.top() / 2;q.pop();q.push(top);ret -= top;count++;if(ret <= half){break;}}return count;}
};

 第三题

1、题目描述

179. 最大数 - 力扣(LeetCode)

2、贪心策略分析

本题的本质是确定元素的先后顺序
但是,排序规则不同于以往的大小,而是以结果大小为标准。
因此,贪心策略:每一次选择,选择两个数字进行组合,看a和b组合,是ab大还是ba大。

lambda表达式:
[](参数列表){返回值}

3、代码

class Solution {
public:string largestNumber(vector<int>& nums) {//转换成字符串vector<string> v;for(auto x : nums){v.push_back(to_string(x));}//按照规则排序//在范围内进行排序,同时使用lambad表达式sort(v.begin(),v.end(),[](const string& s1, const string& s2){return s1 + s2 > s2 + s1;});string ret;for(auto& e : v){ret += e;}if(ret[0] == '0'){return "0";}return ret;}
};

 第四题

1、题目描述

376. 摆动序列 - 力扣(LeetCode)

2、贪心策略分析

贪心策略:
当升序时,选择升序序列最大的,保证后面有更多的降序数字满足摆动
当降序时,选择降序序列最小的,保证后面有更多的升序数字满足摆动
即,波峰和波谷。

怎么判断该数字是不是波峰/波谷?
设置状态
设置一个数字的左边和右边
如果left*right<0
说明,要么是波峰,要么是波谷。

3、代码

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 2)return 1;int ret = 0;int left = 0;for(int i = 0; i < nums.size() - 1; i++){int right = nums[i+1] - nums[i];if(right == 0)//非波峰/谷continue;if(left * right <= 0)//该点是一个波峰/波谷ret++;left = right;}return ret + 1;}
};

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

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

相关文章

助力构建新型电力系统自主可控实时底座

近日&#xff0c;2024亚洲新型电力系统及储能展览会&#xff06;亚洲新型电力及储能论坛会在广州广交会展馆圆满落下帷幕&#xff01;科东软件携多款电力产品亮相展会,并在2024亚洲新型电力及储能论坛发表《“鸿道Intewell操作系统助力构建新型电力系统自主可控实时底座”》的主…

ArcTs布局入门03——层叠布局(Stack)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01; 扫描下面的二维码关注公众号。 1、概述 叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实…

终身免费的Navicat数据库,不需要破解,官方支持

终身免费的Navicat数据库&#xff0c;不需要破解&#xff0c;官方支持 卸载了Navicat&#xff0c;很不爽上干货&#xff0c;Navicat免费版下载地址 卸载了Navicat&#xff0c;很不爽 公司不让用那些破解的数据库软件&#xff0c;之前一直使用Navicat。换了几款其他的数据库试了…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像 2024/7/2 18:19 rootok3588:/# rootok3588:/# rootok3588:/# lsusb Bus 005 Device 001: ID 1d6b:0002 Bus 003 Device 001: ID 1d6b:0001 Bus 001 Device 001: ID 1d6b:0002 Bus 006 Device 00…

零拷贝技术 Zero-Copy

1. 零拷贝概念 零拷贝&#xff1a;在数据传输过程中&#xff0c;减少CPU介入的数据拷贝次数&#xff0c;提高效率。 2. Java中的零拷贝 数据从内核拷贝到JVM堆外内存&#xff0c;避免拷贝到JVM堆。Java NIO中的零拷贝主要通过MappedByteBuffer和FileChannel.transferTo()实现…

将excel表格转换为element table(上)

最近有个功能需要将excel展示到html 界面里面&#xff0c;看是简单的一个需求也是需要费尽心思才完得成 原始数据 想要把excel 读取出来&#xff0c;于是使用xlsl的插件 npm i xlsx通过插件可以获取到已经分析好的数据 然后使用sheet_to_html将数据转换为html 再使用v-htm…

wireshark与tcpdump使用

文章目录 wireshark与tcpdump使用tcpdump过滤expression表达式wireshark的显示过滤器tcpdump语法wireshark与tcpdump使用 tcpdump过滤 官网:http://www.tcpdump.org 需要安装libpcap # 示例 tcpdump -vv -i any port 80 or port 443 -s0 -w /home/tkg.pcapexpression表达式…

Xorbits inference操作实战

1.操作环境 序号软件版本备注1Windows1.版本&#xff1a;Windows 10 专业版2.版本号&#xff1a;21H23.操作系统内部版本&#xff1a;19044.18892Docker Desktop4.24.2 (124339)3WSLUbuntu 22.04 LTS4Python3.105CUDA12.16Dify0.6.6 Xorbits inference 是一个强大且通用的分布…

day09了 加油

浅拷贝 指向同一个地址空间 右边不可取地址 左边一定是到了具体的位置 右值引用std&#xff1a;&#xff1a; move 相信大家默认构造函数都没有问题&#xff0c;所以就不贴例子了 浅拷贝构造函数 只负责复制地址&#xff0c;而不是真的把完整的内存给它 #include <iostre…

shell 脚本编程

简介&#xff1a;用户通过shell向计算机发送指令的&#xff0c;计算机通过shell给用户返回指令的执行结果 通过shell编程可以达到的效果&#xff1a;提高工作效率、可以实现自动化 需要学习的内容&#xff1a;Linux 、 shell的语法规范 编写shell的流程&#xff1a; 第一步…

数据库系统体系结构-DBMS的三级模式结构、DBMS的工作方式、模式定义语言、二级映射

一、体系结构的概念 1、大多数DBMS遵循三级模式结构 &#xff08;1&#xff09;外模式 &#xff08;2&#xff09;概念模式 &#xff08;3&#xff09;内模式 2、DBMS的体系结构描述的应该是系统的组成结构及其联系以及系统结构的设计和变化的原则等 3、1978年美国国家标…

Java学习 (七) 面向对象--多态、object类

一、多态性 多态在java中的体现是 父类的引用指向子类的对象 格式&#xff1a; 父类类型 变量名 子类对象 1、代码案例 vi Person.java public class Person {public String name;public int age;//新增方法public void eat(){System.out.println("人吃饭");}…

github仓库的基本使用-创建、上传文件、删除

1.第一步 先点击左侧菜单栏的远程仓库 2.点击NEW 3.创建仓库 然后点击右下角的 CREATE 4.点击code 点击SSH,然后我出现了You don’t have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS. 1&#xff…

【MySQL备份】Percona XtraBackup加密备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.生成加密密钥 2.5.配置加密密钥文件 3.加密备份 4.优化加密过程 5.解密加密备份 6.准备加密备份 7.恢复加密备份 7.1.使用rsync进行恢复 7.2.使用xtrabackup命令恢…

order by优化案例与原理剖析

一、引言 在数据库查询中&#xff0c;ORDER BY 语句用于对结果集进行排序&#xff0c;是日常开发中不可或缺的一部分。然而&#xff0c;随着数据量的增长&#xff0c;ORDER BY 的性能问题逐渐凸显。本文将结合一个实际案例&#xff0c;分析如何优化 ORDER BY 的性能&#xff0…

ICCV2023图像相关论文摘要速览两部分

tips&#xff1a;有两部分的原因主要是我筛选的时候没有统一image & images Paper1 PromptCap: Prompt-Guided Image Captioning for VQA with GPT-3 摘要原文: Knowledge-based visual question answering (VQA) involves questions that require world knowledge beyon…

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略

什么是半监督目标检测&#xff1f; 传统机器学习根据训练数据集中的标注情况&#xff0c;有着不同的场景&#xff0c;主要包括&#xff1a;监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性&#xff0c;在介绍半监督目标检测方法之前&#xff0c;我…

YOLO10 用分割数据集训练

1、 下载Funiture数据集 http://kaggle.com/datasets/nicolaasregnier/furniture 并生成数据配置文件 data.yaml import yaml import os dataDir "你的工程路径/Furniture/sam_preds_training_set" os.path.join(dataDir, train) num_classes 2 classes [Chair, …

为什么要使用多线程(并发编程)

目录 1.上下文的切换 1.1 什么是上下文切换 2. 并发编程的死锁问题 2.1 死锁产生的原因 2.2 避免死锁的方法 3.资源限制的挑战3.1 什么是资源限制 并发编程的目的是为了让程序更快&#xff0c;大家都知道并不是开启的线程越多越快&#xff0c;因为开启的线程越多随即面临…