贪心算法(一)

目录

一、贪心算法

二、柠檬水找零

三、将数组和减半的最少操作次数

四、最大数

五、摆动序列


 

一、贪心算法

贪心算法的本质是选择每一阶段的局部最优,从而达到全局最优。

贪心策略:1、把解决问题的过程分为若干步。2、解决每一步的时候,都选择当前看起来最优的解法。3、最后希望得到全局最优解。

例子:找零问题

小明买完东西正在付钱,他买了4元钱的东西,然后付给收银员50元,那么收银员要找给他46元,此时收银员手里有 [ 20,10,5,1 ]这些钱,那么应该如何找呢?

我们最先想到的就是尽量先用面值大的去凑出找零,选出2张20,1张5元,1张1元就可以了。

这里的尽量先用面值大的去凑出找零,就是一种贪心策略。

贪心算法的特点

1、贪心策略的提出:贪心策略的提出是没有标准和模板的,可能每一道题的贪心策略都是不同的。

2、贪心策略的正确性:一道题的贪心策略可能最终得到的结果是错误的,所以贪心策略是否正确是需要证明的。


二、柠檬水找零

柠檬水找零

34c2c89a7a75493c80509b99638f7f08.png

贪心策略: 

f18e112ba5bd40f4a1a8f61456b66058.png

对于找零来说,我们最需要考虑的是顾客支付20元的情况,因为如果顾客支付20元的话,找零方法有两种,那么是随便选择哪种方法找零都可以吗?不是的,我们需要选择哪种对20元找零的方法是最好的。

如果是这种情况:现在手里有一张10元,三张5元的。此时来了一个顾客,支付了20元,如果选择第一种对于20元的找零方法,那么找零后,手里就剩了一张20元和一张10元的,然后又来了一个顾客,支付10元,那么此时就无法找零了。

而如果选择第二种对于20元的找零方法,那么找零后,手里就剩了两张5元,一张20元,然后又来了一个顾客,支付10元,那么此时就可以找零了。

所以说,本道题的贪心策略就是,在对于20元进行找零的时候,尽量使用第二种方法找零,也就是尽量保留5元的,因为支付10元只有找零5元这一种方法。

解题代码:

class Solution 
{
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0; // 记录5元和10元的张数for(auto& x : bills){if(x == 5)five++;else if(x == 10){if(five == 0)return false;five--;ten++;}else{if(ten && five){ten--;five--;}else if(five >= 3)five -= 3;elsereturn false;}}return true;}
};

 5cf8c5509bee432992815087e936fd5e.png


三、将数组和减半的最少操作次数

将数组和减半的最少操作次数

1219a66c84af4b30a74a56ef3d10a384.png

分析题目,题目要求我们求出将数组和至少减小一半的最小操作数。我们可以想想,怎么用最少的次数将数组和减少一半呢?

因为我们每次可以选一个数,对其进行减半操作,所以,选择数组中怎样的一个数就是重点了。打个比方,如果选2,那么进行一次操作后,数组总和会减少1,而如果选择4,进行一次操作后,数组总和会减少2。也就是说,每次选择数组中最大的数,就可以用最少的次数,将数组和减半。

贪心策略:

每次挑选当前数组中最大的那个数,将它减半,直到数组和减小到至少一半为止。

我们可以使用一个大根堆,来保存数组元素,堆顶元素就是数组中,目前来说的最大元素,这样就不需要每次遍历去找数组的最大值了。 

解题代码:

class Solution 
{
public:int halveArray(vector<int>& nums) {priority_queue<double> heap;double sum = 0.0;for(int& x : nums){heap.push(x);sum += x;}double tmp = sum;tmp /= 2.0;int count = 0;while(sum > tmp){double top = heap.top();heap.pop();sum -= top / 2.0;count++;heap.push(top / 2.0);}return count;}
};

 09c8f1072da6453cb903986de894581b.png


四、最大数

最大数

f723d9de1b884ea78b289139768525f4.png

题目分析:根据题意,题目要求我们确定各个元素的顺序,然后将它们按这个顺序组合起来,使组成的整数是最大的。比如示例一,其中的元素可以组成 102和210两个整数,结果就是最大的210。

贪心策略: 

根据题目分析,我们最终的目的是将数组的元素按照一定的规则,按顺序放置,也就是对元素进行排序,就得到元素组成的整数是最大的。而本题的元素排序规则如下:

c42a52555adc4774a8d9b86f161aca16.png

解题代码: 

class Solution 
{
public:string largestNumber(vector<int>& nums) {vector<string> num;for(auto& e : nums)num.push_back(to_string(e));sort(num.begin(), num.end(), [&](const string& s1, const string& s2){return s1+s2 > s2+s1;});string ret = "";for(auto& x : num)ret += x;if(ret[0] == '0')return "0";return ret;}
};

5f10bee96fef4b1983fc3dbfa530d5f2.png


五、摆动序列

摆动序列

2626fe0232eb46c5b537d58fed3fe831.png

贪心策略:

如下图,找出数组中处于波峰和波谷位置元素,再加上两个端点的元素,组成的序列就是最长的摆动序列。统计出它们的个数就是最长的摆动序列的长度。

87dec22e566346ef976b488cce302358.png

如何统计最长的摆动序列的长度

88a46d5869634dd8b997a690360e957f.png

确定一个元素处于波峰,用该元素减去它前面一个的元素,差值sum1是大于0的。然后用它后面的元素减去它自己,差值sum2是小于0的,得到 sum1 * sum2是小于0的。

确定一个元素处于波谷,用该元素减去它前面一个的元素,差值sum1是小于0的。然后用它后面的元素减去它自己,差值sum2是大于0的,得到 sum1 * sum2是小于0的。

所以说,对于一个元素,如果用该元素减去它前面一个的元素得到的差值与用它后面的元素减去它自己得到的差值,相乘是负数,就说明该元素处于波峰或者波谷,那么这个元素就属于最长摆动序列的一员,统计长度时就要算上它。

最后再加上两个端点,就是最长摆动序列的长度了。

3f0db4e707bf4ee2a59145d326d11679.png

解题代码:

class Solution 
{
public:int wiggleMaxLength(vector<int>& nums) {// 贪心算法int m = nums.size();if(m < 2)return m;int ret = 0, left = 0;for(int i = 0; i < m-1; i++){int right = nums[i+1] - nums[i];if(right == 0) continue;if(left*right <= 0)ret++;left = right;}return ret+1;}
};

 fa600db1f2194ab694b0e16d55303f81.png

 

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

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

相关文章

Scratch节日作品 | 圣诞节礼物——体验节日的温馨与编程的乐趣! ❄️

今天为大家推荐一款充满节日氛围的Scratch作品——《圣诞礼物》&#xff01;这款程序不仅带来了雪花飘落、圣诞老人和麋鹿的经典场景&#xff0c;还通过编程的形式让小朋友们体验到收到礼物的喜悦。通过这款游戏&#xff0c;小朋友们能学习编程知识、了解圣诞文化&#xff0c;同…

基于Qwen2-VL模型针对 ImageToText 任务进行微调训练 - 数据处理

基于Qwen2-VL模型针对 ImageToText 任务进行微调训练 - 数据处理 flyfish 给定的图像生成一段自然语言描述。它的目标是生成一个或多个句子&#xff0c;能够准确地描述图像中的主要内容、物体、动作、场景等信息。例如&#xff0c;对于一张包含一只狗在草地上奔跑的图像&…

Spring Boot整合 RabbitMQ

文章目录 一. 引入依赖二. 添加配置三. Work Queue(工作队列模式)声明队列生产者消费者 四. Publish/Subscribe(发布订阅模式)声明队列和交换机生产者消费者 五. Routing(路由模式)声明队列和交换机生产者消费者 六. Topics(通配符模式)声明队列和交换机生产者消费者 一. 引入依…

谷粒商城—分布式基础

1. 整体介绍 1)安装vagrant 2)安装Centos7 $ vagrant init centos/7 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on…

【考前预习】1.计算机网络概述

往期推荐 子网掩码、网络地址、广播地址、子网划分及计算-CSDN博客 一文搞懂大数据流式计算引擎Flink【万字详解&#xff0c;史上最全】-CSDN博客 浅学React和JSX-CSDN博客 浅谈云原生--微服务、CICD、Serverless、服务网格_云原生 serverless-CSDN博客 浅谈维度建模、数据分析…

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…

AI智算-k8s部署大语言模型管理工具Ollama

文章目录 简介k8s部署OllamaOpen WebUI访问Open-WebUI 简介 Github&#xff1a;https://github.com/ollama/ollama 官网&#xff1a;https://ollama.com/ API&#xff1a;https://github.com/ollama/ollama/blob/main/docs/api.md Ollama 是一个基于 Go 语言开发的可以本地运…

PyQt事件机制练习

一、思维导图 二、代码 import sysfrom PyQt6.QtTextToSpeech import QTextToSpeech from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit from PyQt6 import uic from PyQt6.QtCore import Qt, QTimerEvent, QTimeclass MyWidget(QWidget):d…

硬件设计 | Altium Designer软件PCB规则设置

基于Altium Designer&#xff08;24.9.1&#xff09;版本 嘉立创PCB工艺加工能力范围说明-嘉立创PCB打样专业工厂-线路板打样 规则参考-嘉立创 注意事项 1.每次设置完规则参数都要点击应用保存 2.每次创建PCB&#xff0c;都要设置好参数 3.可以设置默认规则&#xff0c;将…

【计算机学习笔记】GB2312、GBK、Unicode等字符编码的理解

之前编写win32程序时没怎么关注过宽字符到底是个啥东西&#xff0c;最近在编写网络框架又遇到字符相关的问题&#xff0c;所以写一篇文章记录一下&#xff08;有些部分属于个人理解&#xff0c;如果有错误欢迎指出&#xff09; 目录 几个常见的编码方式Unicode和UTF-8、UTF-16、…

深入理解 CSS 文本换行: overflow-wrap 和 word-break

前言 正常情况下&#xff0c;在固定宽度的盒子中的中文会自动换行。但是&#xff0c;当遇到非常长的英文单词或者很长的 URL 时&#xff0c;文本可能就不会自动换行&#xff0c;而会溢出所在容器。幸运的是&#xff0c;CSS 为我们提供了一些和文本换行相关的属性&#xff1b;今…

centos9升级OpenSSH

需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2&#xff08;根据需求进行升级&#xff09; 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…

Pull requests 和Merge Request其实是一个意思

Pull requests的定义 在Git中&#xff0c;PR&#xff08;Pull Request&#xff09;是一种协作开发的常用方式。它允许开发者将自己的代码变更&#xff08;通常是一个分支&#xff09;提交到项目的仓库中&#xff0c;然后请求负责代码审查的人员将这些变更合并到主分支中。通过…

【ubuntu】将Chroma配置为LINUX服务

Chroma是一个轻量级向量数据库。既然是数据库&#xff0c;那么我希望它是能够长时间运行。最直接的方式是配置为service服务。 可惜官方没有去提供配置为服务的办法&#xff0c;而鄙人对docker又不是特别感冒。所以自己研究了下chroma配置为服务的方式。 系统&#xff1a;ubu…

w~深度学习~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663254 #Motion Plan 代码 github.com/liangwq/robot_motion_planing 轨迹约束中的软硬约束 前面的几篇文章已经介绍了&#xff0c;轨迹约束的本质就是在做带约束的轨迹拟合。输入就是waypoint点list&#xff0c;约束…

机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法

引言 大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理任务中展现了强大的能力&#xff0c;但为了使其更贴合特定应用场景&#xff0c;通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据&#xff0c;并通过具体…

cocos中使用SocketIO

Creator版本&#xff1a;v3.8.3 socketIO是socket的一个封装 cocos里集成了websocket但是没有socketIO 下载依赖文件 首先需要下载socketIO代码&#xff0c;版本要和后端保持一致 能npm下载最好npm install socket.io-clientversion(需要指定版本) 但我这一直超时,所以就直接…

AWD学习(二)

学习参考&#xff1a; AWD攻防学习总结&#xff08;草稿状态&#xff0c;待陆续补充&#xff09;_awd攻防赛入门-CSDN博客国赛分区赛awd赛后总结-安心做awd混子-安全客 - 安全资讯平台 记第一次 AWD 赛前准备与赛后小结-腾讯云开发者社区-腾讯云 AWD学习笔记 - DiaosSamas Blog…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理 flyfish 输入 输出 [‘第一张图片是一幅中国山水画&#xff0c;描绘了一座山峰和周围的树木。第二张图片是一张现代照片&#xff0c;展示了一座山峰和周围的自然景观&#xff0c;包括水体和植被。’] fro…