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

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

在这里插入图片描述

文章目录

  • 前言
  • 例题
    • 1.最优除法
    • 2.跳跃游戏2
    • 3.跳跃游戏1
    • 4.加油站
    • 5.单调递增的数字
    • 6.坏了的计算器

前言

本篇文章是对贪心算法练习题的讲解,有关贪心算法的讲解可以看本系列的第一篇文章,这里就不再讲解,继续讲解相关练习题。

例题

1.最优除法

题目

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

string optimalDivision(vector<int>& nums){//先处理个数小于等于2的情况if(nums.size()==1){return to_string(nums[0]);}if(nums.size()==2){return to_string(nums[0]) + '/' + to_string(nums[1]);}string ret;//只在第一个数后面加上(,最后一个数后面加上)for (int i = 0; i < nums.size(); i++){ret += to_string(nums[i]);if(i==0){ret += "/(";}else if(i==nums.size()-1){ret += ')';}else{ret += '/';}}return ret;
}

2.跳跃游戏2

题目

在这里插入图片描述

算法原理

本道题和下一道题跳跃游戏1的区别就是,本题要求统计最小跳跃次数,有就返回,没有就返回-1;下面图片中讲解本道题的贪心策略。

在这里插入图片描述

代码实现

int jump(vector<int>& nums){//左指针表示当前位置可以跳的最左位置,也就是跳的最小的步数位置//右指针和maxpos指针表示当前位置可以跳的最右位置,也就是跳的最大的步数位置int left = 0, right = 0, maxpos = 0;int n = nums.size();int ret = 0;//循环条件,当出现左指针大于右指针,结束,表示不能跳到最终位置while(left<=right){//如果maxpos指针的位置大于等于数组的长度,结束if(maxpos>=n-1){return ret;}//从当前左指针位置遍历到右指针位置,更新下一次可以跳到的最右位置for (int i = left; i <= right; i++){maxpos = max(maxpos, nums[i] + i);}//左指针更新为当前右指针的下一个,表示最少跳一步left=right+1;//右指针更新为maxpos指向的位置,表示最多跳的步数right = maxpos;ret++;}return -1;
}

3.跳跃游戏1

题目

在这里插入图片描述

算法原理

相较于上一个题,本道题的贪心策略还是相同,只不过最后的返回结果不同,本道题相对简单只需判断能否到达最终位置,能就返回true,不能就返回false。

代码实现

bool canJump(vector<int>& nums){//和跳跃游戏2相同,只是返回结果不同int left = 0, right = 0, maxpos = 0;int n=nums.size();while(left<=right){if(maxpos>=n-1){return true;}for (int i = left; i <= right; i++){maxpos = max(maxpos, nums[i] + i);}left=right+1;right = maxpos;}return false;
}

4.加油站

题目

在这里插入图片描述

在这里插入图片描述

算法原理

本道题其实就是在暴力枚举的基础上利用贪心的思想处理一些没必要的情况,直接看下面图片中的讲解即可。

在这里插入图片描述

代码实现

int canCompleteCircuit(vector<int>& gas, vector<int>& cost){int n = gas.size();//枚举所有的起始位置for (int i = 0; i < n; i++){//净收益int rest = 0;//步数int step=0;for (; step < n; step++){//下一步的位置int index = (i + step) % n;rest = rest + gas[index] - cost[index];if(rest<0){break;}}if(rest>=0){return i;}//这里是贪心的思想,从小于0的下一个位置开始从新作为起始位置i += step;}return -1;
}

5.单调递增的数字

题目

在这里插入图片描述

算法原理

本道题的贪心策略:找到第一个下降的数位,比如123452678中,5的下一个是2,5到2下降,第一个下降的数位就是5,因为只能减小,不能变大,如果把2修改成比5大的,就会导致该数变大,所以只能修改下降数位前面的数字,不能修改下降数位后的数字,5的前面是4,可以将5修改成4,然后后面其余的数全部修改成9,当前就变成123449999,比修改前的小,但是是能修改成的最大的数。

这里就有一个细节点,可能会出现这种情况123442678,第一个下降的数位是4,4的前面还是4,如果修改成1123439999,依然不是递增的,所以,如果下降数位前面有相同的数,要一直向前找,直到找到不同的数修改,这里的正确修改就是123339999,将两个4都修改。

代码实现

int monotoneIncreasingDigits(int n){//先将数字转化成字符串形式string s = to_string(n);//找到第一个递减的位置int m = s.size();int i = 0;while(i+1<m&&s[i]<=s[i+1]){i++;}//如果没有找到递减位置,直接返回当前数字if(i+1==m){return n;}//找到递减位置,向前找到最左侧相同值的位置while(i-1>=0&&s[i]==s[i-1]){i--;}//第一个相同值-1,其余位置全部修改成9s[i] = s[i] - 1;for (int j = i + 1; j < m; j++){s[j] = '9';}//修改完后转化成数字返回return stoi(s);
}

6.坏了的计算器

题目

在这里插入图片描述

算法原理

本道题首先用到的是正难则反思想,正着来是从初始值经过多次减法或者双倍乘法到目标值,而反着来就是从目标值经过多次加法或者二倍除法变成初始值。

因为本道题的数都是正整数,不会出现小数的情况,对于当前数原本有两种情况可以选择,一种是加1,一种是除2;而如果是奇数的话,就只能选择加1,因为除2就会出现小数的情况;而如果是偶数的情况两种情况都可以选择,但是这里用到了贪心的思想,优先选择除2,证明:假设当前数是n,如果先经过k次加1,再除2,最后结果就是(n+k)/2,相当于经过(k+1)次;如果先除2就变成n/2,再加上k/2就变成最后结果(n+k)/2,相当于经过2/k+1次,次数较少,所以优先选择除2。

代码实现

int brokenCalc(int startValue, int target){//正难则反思想,目标值除法或者加法变成初始值int ret = 0;while(target!=startValue){//如果目标值小于初始值,全选加法if(target<startValue){ret += (startValue - target);break;}//如果大于else{//如果目标值是奇数,选加法if(target%2==1){target += 1;}//如果是偶数,优先选除法else{target /= 2;}ret++;}}return ret;
}

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

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

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

相关文章

2024年度十大网络安全热点事件盘点:时代暗涌下的安全危机

2024年&#xff0c;国际形势风云变幻&#xff0c;地缘政治的动荡与科技革命的浪潮交织成一幅复杂图景。以人工智能为代表的前沿科技突飞猛进&#xff0c;正以前所未有的速度重塑着世界的每一个角落&#xff0c;引领着人类社会迈向一个更加智能、高效与便捷的未来。 然而&#…

【教程】禁止网页右键和打开调试页面

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 普通页面&#xff0c;可以右键&#xff0c;并打开调试页面。不安全&#xff1a; 在网页中添加一下JavaScript代码&#xff0c;可以禁止网页右键和打开调…

使用开源项目:pdf2docx,让PDF转换为Word

pdf2docx&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 环境&#xff1a;windows电脑 1.安装python Download Python | Python.org 最好下载3.8以上的版本 安装时记得选择上&#xff1a;Add ... Path 安装时默认会装pip等工具&#xff0c;因此下载安装包时…

电控---中断

中断 1.处理器系统在执行代码的时候&#xff0c;会从存储器依次取出指令和数据&#xff0c;这种能力需要在处理器里保存一个存储器地址&#xff0c;就是所谓的程序计数器&#xff08;Program Counter,PC&#xff09;&#xff0c;也叫程序指针 2.当外部中断&#xff08;Extern …

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

​​ 系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编…

计算机视觉-边缘检测

一、边缘 1.1 边缘的类型 ①实体上的边缘 ②深度上的边缘 ③符号的边缘 ④阴影产生的边缘 不同任务关注的边缘不一样 1.2 提取边缘 突变-求导&#xff08;求导也是一种卷积&#xff09; 近似&#xff0c;1&#xff08;右边的一个值-自己可以用卷积做&#xff09; 该点f(x,y)…

【高级篇 / IPv6】(7.2) ❀ 05. 在60E上配置ADSL拨号宽带上网(IPv6) ❀ FortiGate 防火墙

【简介】上一篇文章了解了如何在60E上配置ADSL拨号IPv4上网&#xff0c;这篇文章将介绍如何在FortiGate上配置IPv6&#xff0c;使得内网电脑都能以IPv6地址上网。 启用IPv6 由于IPv6比较小众&#xff0c;默认在防火墙是看不到的。 ① 接上一篇文章&#xff0c;由于Internal已经…

可视化大屏在石油方面的应用。

可视化大屏通过整合石油工业全链条数据&#xff0c;构建数字孪生驱动的运营监控体系&#xff0c;显著提升油气勘探、开采、储运及炼化的管理效能。其技术架构依托工业物联网&#xff08;IIoT&#xff09;实时采集钻井参数、管道压力、储罐液位等数据&#xff0c;通过OPC UA协议…

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…

modbus协议处理

//------------------------0x01-------------------------------- //MDA_usart_send: aa 55 01 00 06 00 02 00 05 //转modbusTCP——Master——send&#xff1a;地址00002&#xff0c;寄存器数量&#xff1a;00005 00 00 00 00 00 06 01 01 00 02 00 05 //ModbusTCP——Slave…

实验十 Servlet(一)

实验十 Servlet(一) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 1、参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c…

RK3566-移植5.10内核Ubuntu22.04

说明 记录了本人使用泰山派&#xff08;RK3566&#xff09;作为平台并且成功移植5.10.160版本kernel和ubuntu22.04&#xff0c;并且成功配置&连接网络的完整过程。 本文章所用ubuntu下载地址&#xff1a;ubuntu-cdimage-ubuntu-base-releases-22.04-release安装包下载_开源…

实现基础的shell程序

1. 实现一个基础的 shell 程序&#xff0c;主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现&#xff1a; ⽂件复制⽬录复制 1.1.2. ls 命令主要实现&#xff1a; ls -l 命令的功能 1.1. 在框架设计上&#xff0c;采⽤模块化设计思想&#xff0c;并具备⼀定的可扩…

计算机网络 应用层 笔记 (电子邮件系统,SMTP,POP3,MIME,IMAP,万维网,HTTP,html)

电子邮件系统&#xff1a; SMTP协议 基本概念 工作原理 连接建立&#xff1a; 命令交互 客户端发送命令&#xff1a; 服务器响应&#xff1a; 邮件传输&#xff1a; 连接关闭&#xff1a; 主要命令 邮件发送流程 SMTP的缺点: MIME&#xff1a; POP3协议 基本概念…

Java 数据库连接池:HikariCP 与 Druid 的对比

Java 数据库连接池&#xff1a;HikariCP 与 Druid 的对比 数据库连接池&#xff1a;HikariCP 1. 卓越的性能表现 HikariCP 在数据库连接池领域以其卓越的性能脱颖而出。 其字节码经过精心优化&#xff0c;减少了不必要的开销&#xff0c;使得连接获取和释放的速度极快。 在…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化

1.25 视觉风暴&#xff1a;NumPy驱动数据可视化 目录 #mermaid-svg-i3nKPm64ZuQ9UcNI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i3nKPm64ZuQ9UcNI .error-icon{fill:#552222;}#mermaid-svg-i3nKPm64ZuQ9UcNI …

【实践案例】基于大语言模型的海龟汤游戏

文章目录 项目背景提示词构建海龟汤主持人真相判断专家 具体实现流程文心一言大语言模型“海龟汤”插件参考 项目背景 “海龟汤”作为一种聚会类桌游&#xff0c;又称情境推理游戏&#xff0c;是一种猜测情境还原事件真相的智力游戏。其玩法是由出题者提出一个难以理解的事件&…

Spring PropertyPlaceholderConfigurer多配置问题

本文重点是通过例子代码的debug了解PropertyPlaceholderConfigurer的原理 更多可阅读&#xff1a;placeholderconfigurer文档 了解 目录 测试程序如下PropertyPlaceholderConfigurerplaceholderConfigurer1 & placeholderConfigurer2的执行userbean的BeanDefinition应用Pr…

PVE纵览-解锁 PVE 的潜力:配置显卡直通

PVE纵览-解锁 PVE 的潜力&#xff1a;配置显卡直通 文章目录 PVE纵览-解锁 PVE 的潜力&#xff1a;配置显卡直通摘要显卡直通的优势准备工作硬件要求软件要求 启用 IOMMU修改 BIOS 设置配置 PVE 系统 配置显卡直通识别设备编辑配置文件安装必要驱动 常见问题及解决方案显卡直通…

线性调整器——耗能型调整器

线性调整器又称线性电压调节器&#xff0c;以下是关于它的介绍&#xff1a; 基本工作原理 线性调整器的基本电路如图1.1(a)所示,晶体管Q1(工作于线性状态,或非开关状态)构成一个连接直流源V和输出端V。的可调电气电阻,直流源V由60Hz隔离变压器&#xff08;电气隔离和整流&#…