【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh–CSDN博客
✨ 文章所属专栏:贪心算法篇–CSDN博客

在这里插入图片描述

文章目录

  • 一.贪心算法
    • 1.什么是贪心算法
    • 2.贪心算法的特点
  • 二.例题
    • 1.柠檬水找零
    • 2.将数组和减半的最小操作次数
    • 3.最大数
    • 4.摆动序列

一.贪心算法

1.什么是贪心算法

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下的最优决策的算法策略。他并不从整体最优上加以考虑,而是做出在当前看来是最好的选择。

1.把解决问题的过程分为若干步骤。

2.解决每一步时都选取当前看起来最优的选择。

3.“希望”得到全局最优解。(注意是“希望”,可不一定就是最优解)

简单形容就是贪婪+鼠目寸光,因此叫做贪心算法。

下面介绍几个典型的示例:

在这里插入图片描述

2.贪心算法的特点

  • 贪心策略的提出
    • 贪心策略的提出是没有标准和模板的,可能每一道题的贪心策略都是不同的,因此在学习贪心算法的时候重点要掌握每一道题的策略,把这道题的策略当成经验。
  • 贪心策略的正确性
    • 前面提到一个词“希望”得到最优解,因为有可能“贪心策略是一个错误的方法,正确的贪心策略,是需要严格的数学证明。

二.例题

1.柠檬水找零

题目

在这里插入图片描述

在这里插入图片描述

算法原理

根据题意可以明白,顾客付钱有三种情况,如果是5美元,那就直接收下;如果是10美元,并且当前手里5美元的数量大于等于1,收下然后找零5美元,如果没有5美元,则返回false;如果是20美元,有两种找零方式,第一种:10+5;第二种:5+5+5;这里就用到了贪心的思想,优先使用第一种方式找零。如果第一次20美元使用第二种找零方式,恰好手里有三张5美元,一张10美元,如果第一次就使用三张5美元,等之后再次遇到10美元,就只剩一张10美元,不能找零。

这里用到的是交换论证法:如果20美元使用第二种找零方式,手里的10美元一直到最后也没有使用,因此10美元可以替换20美元找零时的两张5美元;如果第一次20美元使用第二种找零方式5+5+5,第二次使用第一种方式找零10+5,第二次的10可以和第一次的两张5交换,交换后无影响。

代码实现

bool lemonadeChange(vector<int>& bills){//设置两个变量一个用来表示5元的个数,一用来表示10元的个数int five = 0, ten = 0;for(auto x : bills){//如果给的是5元,直接收下if(x==5){five++;}//如果给的是10元,先判度是否有5元找零,有就找零收下,没有就返回if(x==10){if(five==0){return false;}else{five--;ten++;}}//如果给的是20元,有三种情况if(x==20){//贪心思想,优先考虑10+5找零if(ten&&five){five--;ten--;}//第一种不能找零,再考虑第二种找零方式5+5+5else if(five>=3){five -= 3;}//如果两种情况都不能找零,返回else{return false;}}}return true;
}

2.将数组和减半的最小操作次数

题目

在这里插入图片描述

在这里插入图片描述

算法原理

因此本道题的贪心策略:使用最少的操作次数完成数组和的减半,因此每次选择一个数减半时,都选择最大的那个数减半,这里就是贪心的思想,每次都选择最大的数减半。既然要快速获取数组中的最大数,就可以借助大根堆这个数据结构,每次都选择堆顶的元素减半,减半后从新放回堆中调整,然后循环进行,知道数组和减到一半,返回最小操作数。

代码实现

int halveArray(vector<int>& nums){//建立一个大根堆priority_queue<double> heap;//遍历数组求和并存放到堆中double sum = 0.0;for(int x : nums){heap.push(x);sum += x;}//先获取数组和的一半,每次减去堆顶元素的一半直到减为小于等于0sum /= 2.0;int count=0;while(sum>0){//获取堆顶元素的一半,并删去double t = heap.top() / 2.0;heap.pop();count++;sum -= t;heap.push(t);}return count;
}

3.最大数

题目

在这里插入图片描述

算法原理

根据题意要求,可以自定义排序规则,因为要返回的是组合后最大的数,所以按照自定义的排序规则从大到小的排序;比如现在有两个数,a和b,有两种组合方式ab和ba,如果组合后ab>ba,则a在前,b在后;如果ab=ba,则a=b;如果ab<ba,则b在前,a在后;比如示例一:a=10,b=2,组合后ab=102<ba=210,所以b(2)在前,a(10)在后,根据自定义排序规则将整个数组中的元素都排序后,然后从前往后组合就是要找的最大数。

这里有一个细节点,如何快速的将两个数组合比较?可以先将每一个数都转化成字符串的形式,组合时直接的将两个字符串相加拼接即可,这样就能快速的组合,最后排完序后,还可以直接从前往后将所有字符串拼接,就是要返回的结果。

至于为什么上面的这个自定义排序规则是正确的,可以看下面的证明过程:

在这里插入图片描述

代码实现

string largestNumber(vector<int>& nums){//先将每个数字转换成字符串,存放到字典数组中vector<string> dictionary;for(auto x : nums){dictionary.push_back(to_string(x));}//使用Lambda表达式自定义排序规则sort(dictionary.begin(), dictionary.end(), [&](const string& s1, const string& s2){return s1 + s2 > s2 + s1; });string ret;for(auto s : dictionary){ret += s;}if(ret[0]=='0'){return "0";}return ret;
}

4.摆动序列

题目

在这里插入图片描述

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

//全局变量表示左侧的峰值
int left = 0;
int wiggleMaxLength(vector<int>& nums){//寻找波峰和波谷int ret = 0;for (int i = 0; i < nums.size(); i++){//如果是最后一个位置,直接+1if(i==nums.size()-1){ret++;break;}//先计算当前位置右侧的峰值int right = nums[i + 1] - nums[i];//如果右侧峰值等于0,跳过if(right==0){continue;}//如果左右两侧峰值相乘小于0,表示当前位置是波峰或者波谷if(left*right<=0){ret++;}//将当前位置的右侧峰值赋值给左侧,表示下一个位置的左侧峰值left = right;}return ret;
}

以上就是关于贪心算法以及一些练习题的讲解,如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!
在这里插入图片描述

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

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

相关文章

ARM TEE

在ARM的语境中&#xff0c;TEE是Trusted Execution Environment&#xff08;可信执行环境&#xff09;的缩写。ARM TEE就是基于ARM架构实现的可信执行环境&#xff0c;以下是具体介绍&#xff1a; 定义与原理 定义&#xff1a;ARM TEE是基于独立硬件&#xff0c;和主操作系统…

双亲委派(jvm)

1.双亲委派 在 Java 中&#xff0c;双薪委派通常是指双亲委派模型&#xff0c;它是 Java 类加载器的一种工作模式&#xff0c;用于确保类加载的安全性和一致性。以下是其相关介绍&#xff1a; 定义与作用 定义&#xff1a;双亲委派模型要求除了顶层的启动类加载器外&#xf…

阿里云 ubuntu22.04 中国区节点安装 Docker

下面是一份在 Ubuntu 22.04 (Jammy) 上&#xff0c;通过阿里云镜像源来安装并配置 Docker 的详细步骤示例&#xff0c;可在中国区阿里云节点使用&#xff1a; 一、卸载旧版本 (如已安装) 如果系统中已经安装了旧版 Docker (可能是 docker、docker-engine、docker.io、containe…

一款wordpress AI免费插件自动内容生成+前端AI交互+文章批量采集

一款wordpressAI自动内容生成前端AI会话窗口交互文章批量采集免费插件 1. SEO优化文章生成 关键词驱动的内容生成&#xff1a;用户可以输入关键词或长尾关键词&#xff0c;插件会根据这些关键词生成高质量的SEO优化文章。文章结构清晰&#xff0c;语言自然流畅&#xff0c;符合…

MongoDB 聚合

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值&#xff0c;求和等)&#xff0c;并返回计算后的数据结果。 有点类似 SQL 语句中的 count(*)。 aggregate() 方法 MongoDB中聚合的方法使用aggregate()。 语法 aggregate() 方法的基本语法格式如下所示&#xff1…

Linux03——常见的操作命令

root用户以及权限 Linux系统的超级管理员用户是&#xff1a;root用户 su命令 可以切换用户&#xff0c;语法&#xff1a;su [-] [用户名]- 表示切换后加载环境变量&#xff0c;建议带上用户可以省略&#xff0c;省略默认切换到root su命令是用于账户切换的系统命令&#xff…

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

关于大数据

在大数据背景下存在的问题&#xff1a; 非结构化、半结构化数据&#xff1a;NoSQL数据库只负责存储&#xff1b;程序处理时涉及到数据移动&#xff0c;速度慢 是否存在一套整体解决方案&#xff1f; 可以存储并处理海量结构化、半结构化、非结构化数据 处理海量数据的速…

Safari常用快捷键

一、书签边栏 1、显示或隐藏书签边栏&#xff1a;Control-Command-1 2、选择下一个书签或文件夹&#xff1a;向上头键或向下头键 3、打开所选书签&#xff1a;空格键 4、打开所选文件夹&#xff1a;空格键或右箭头键 5、关闭所选文件夹&#xff1a;空格键或左箭头键 6、更…

通过docker安装部署deepseek以及python实现

前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…

企业四要素如何用PHP进行调用

一、什么是企业四要素&#xff1f; 企业四要素接口是在企业三要素&#xff08;企业名称、统一社会信用代码、法定代表人姓名&#xff09;的基础上&#xff0c;增加了一个关键要素&#xff0c;通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…

Android性能优化系列——卡顿优化

卡顿&#xff0c;就是用户体感界面不流畅。我们知道手机的屏幕画面是按照一定频率来刷新的&#xff0c;理论上讲&#xff0c;24 帧的画面更新就能让人眼感觉是连贯的。但是实际上&#xff0c;这个只是针对普通的视频而言。对于一些强交互或者较为敏感的场景来说&#xff0c;比如…

激光工控机在自动化领域中有哪些作用?

首先是对于高精度加工控制方面&#xff1a;激光工控机能够精确控制激光光束的运动轨迹和输出功率&#xff0c;实现对各种材料的精细切割、雕刻和焊接&#xff0c;保证加工质量和效率。 其次还能实时监控与远程控制激光工控机凭借其强大的网络通信功能&#xff0c;可以实时监控…

陷入闭包:理解 React 状态管理中的怪癖

TLDR 闭包就像函数随身携带的背包&#xff0c;包含它们创建时的数据React 组件使用闭包来记住它们的状态和属性过时的闭包可能导致状态更新不如预期时的错误函数式更新提供了一个可靠的方式来处理最新状态 简介 你是否曾经疑惑过&#xff0c;为什么有时你的 React 状态更新不…

Cloud Computing-HCIA

FusionAccess 快速封装虚拟机特点 拥有独立的存储空间系统盘。方便统一更新和还原。同一模板分发的话 SID 会相同。 在虚拟机桌面发放流程中&#xff0c;创建虚拟机时&#xff0c;HDC 组件会检查指定的计算机组和桌面组。 KVM Kernel-based Virtual Machine&#xff0c;即基于…

LeetCode 3442.奇偶频次间的最大差值 I

给你一个由小写英文字母组成的字符串 s 。请你找出字符串中两个字符的出现频次之间的 最大 差值&#xff0c;这两个字符需要满足&#xff1a; 一个字符在字符串中出现 偶数次 。 另一个字符在字符串中出现 奇数次 。 返回 最大 差值&#xff0c;计算方法是出现 奇数次 字符的次…

基于STM32的智能加湿器设计(新版本)

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是加湿器。设备的详细功能见网盘中的文章《12、基于…

21.2.2 保存

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 如果打开某个Excel文件修改后&#xff0c;需要保存到原文件或者用新的文件名保存&#xff0c;在 Excel.Application.Quit() 前使用W…

华水967数据结构2024真题(回忆版)

一、 选择[10道) (20分). 1、数据结构中&#xff0c;从逻辑结构上可以把数据结构分为() 答案&#xff1a;线性结构和非线性结构 2、给了一个二叉树的中序遍历&#xff0c;求二叉树的后序遍历 解析&#xff1a; 要根据中序遍历的结果来推导后序遍历&#xff0c;需要知道二叉…

除了网页,还有哪些方式可以访问deepseek r1

DeepSeek R1 是一款先进的人工智能模型&#xff0c;用户可以通过多种方式进行访问和使用&#xff1a; 官方网站&#xff1a;用户可以直接访问 DeepSeek 的官方网站&#xff0c;注册账户后即可使用其在线服务。 API 集成&#xff1a;开发者可以通过 DeepSeek 提供的 API&#x…