代码随想录算法训练营第三十六天 | LeetCode 738. 单调递增的数字、贪心算法总结

代码随想录算法训练营第三十六天 | LeetCode 738. 单调递增的数字、贪心算法总结

文章链接:单调递增的数字 贪心算法总结
视频链接:单调递增的数字

1. LeetCode 738. 单调递增的数字

1.1 思路

  1. 本题的贪心思路是什么?举个例子 32,这不是一个单调递增的数字,那就要处理后再返回了,十位上的 3一定要-1,它如果不变的话,就无法处理,因为要返回一个<=32 的数,3->2 后,个位上的 2 就可以变大了,直接 2->9,最终返回29
  2. 大体思路:如果发现两位不符合单调递增前一位小于等于后一位的情况要做处理时,就要对前一位-1,后一位再变为 9。
  3. 那我们要从前往后遍历还是从后往前遍历呢?拿 332 举例,如果从前往后,比较到十位和个位时,整体从332->329,但此时百位和十位又不对了,因为后面处理完的值可能是比前面的值小的,没有重复利用到前面的比较结果。如果从后往前遍历,比较到十位和个位时,整体从332->329,再比较百位和十位时,整体从 329->299,这样能得到我们要的结果是因为从后往前遍历时是能够利用到后面遍历过的结果的
  4. 为了方便遍历,把 n 变为字符数组char[] chars=(n+“”).toCharArray()。再定义个 start 标记从哪个位置开始往后遍历将数值变为 9,初始化为 chars.length,初始化为这个是因为如果数字本身就是单调递增的就不用更改数值
  5. for(int i=chars.length-1;i>0;i++)这里 i 不能等于 0 是因为后面是 i-1 和 i 比较,等于 0 会越界,然后是处理逻辑,if(chars[i-1]>chars[i])即前面一位大于当前一位时,就要将前一位-1,chars[i-1]–,然后用 start=i 标记一下位置,后面处理 start 后面的数位都变为 9
  6. 上面处理完就要更新数值 9 了,for(int i=start;i<chars.length;i++)chars[i]=‘9’。
  7. 这里可能疑惑,为什么不在上面第一个循环里就把数值变为 9 呢?举例 1000,我们这里比较处理的逻辑只发生在千位和百位的“10”,只会变为了“09”,整体就是变为了“0900”而我们要的是“999”
  8. 最后将这个 char[] 转为 String 后再转为 int

1.2 代码

//
class Solution {public int monotoneIncreasingDigits(int n) {char[] chars=(n+"").toCharArray();int start=chars.length;for(int i=chars.length-1;i>0;i--){if(chars[i-1]>chars[i]){chars[i-1]--;start=i;}}for(int i=start;i<chars.length;i++){chars[i]='9';}return Integer.parseInt(new String(chars));}
}

贪心算法总结

2.1 理论基础

  1. 贪心很简单,就是常识?
    贪心思路往往很巧妙,并不简单
  2. 贪心有没有固定的套路?
    无套路,也没有框架,只能多练
  3. 什么题目是贪心呢?

观点来自程序员Carl:如果找出局部最优并可以推出全局最优,就是贪心,如果局部最优都没找出来,就不是贪心,可能是单纯的模拟。但学会解题就行

  1. 如何知道局部最优推出全局最优,有数学证明么?

观点来自程序员Carl:在做贪心题的过程中,如果再来一个数据证明,其实没有必要,手动模拟一下,如果找不出反例,就试试贪心。面试中,代码写出来跑过测试用例即可,或者自己能自圆其说理由就行了

2.2 贪心简单题

以下三道题目就是简单题,大家会发现贪心感觉就是常识。是的,如下三道题目,就是靠常识,但也得具体分析局部最优是什么,全局最优是什么,贪心也要贪的有理有据。

  1. 455. 分发饼干
  2. 1005. K 次取反后最大化的数组和
  3. 860. 柠檬水找零

2.3 贪心中等题

贪心中等题,靠常识可能就有点想不出来了。开始初现贪心算法的难度与巧妙之处

  1. 376. 摆动序列
  2. 738. 单调递增的数字
2.3.1 贪心解决股票问题

大家都知道股票系列问题是动规的专长,其实用贪心也可以解决,而且还不止就这两道题目,但这两道比较典型。

  1. 122. 买卖股票的最佳时机 II
  2. 714. 买卖股票的最佳时机含手续费
2.3.2 两个维度权衡问题

在出现两个维度相互影响的情况时,两边一起考虑一定会顾此失彼,要先确定一个维度,再确定另一个一个维度。

  1. 135. 分发糖果
  2. 406. 根据身高重建队列

2.4 贪心难题

这里的题目如果没有接触过,其实是很难想到的,甚至接触过,也一时想不出来,所以题目不要做一遍,要多练!

2.4.1 贪心解决区间问题

关于区间问题,各种覆盖各种去重。

  1. 55. 跳跃游戏
  2. 45. 跳跃游戏 II
  3. 452. 用最少数量的箭引爆气球
  4. 435. 无重叠区间
  5. 763. 划分字母区间
  6. 56. 合并区间
2.4.2 其他难题
  1. 最大子数组和其实是动态规划的题目,但贪心性能更优,很多同学也是第一次发现贪心能比动规更优的题目。
  2. 134. 加油站可能以为是一道模拟题,但就算模拟其实也不简单,需要把while用的很娴熟。但其实是可以使用贪心给时间复杂度降低一个数量级。
  3. 最后贪心系列压轴题目968. 监控二叉树,不仅贪心的思路不好想,而且需要对二叉树的操作特别娴熟,这就是典型的交叉类难题了。

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

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

相关文章

Vue 2 vs Vue 3: 响应式系统的比较 ⚖️

Vue 2 vs Vue 3: 响应式系统的比较 ⚖️ Vue.js 是一个极为流行的前端框架&#xff0c;其响应式系统是其强大特性之一。然而&#xff0c;在 Vue 2 和 Vue 3 中&#xff0c;响应式系统的实现方式有所不同。Vue 2 使用 Object.defineProperty 实现数据劫持&#xff0c;而 Vue 3 …

java基础+数据库基础+系统+JVM问题

的哎的哎 1、基础部分 java线程池 队列的选择 答&#xff1a; SingleThreadPool:适用于多个任务顺序执行的场景。 它使用的是LinkedBlockingQueue<>()&#xff0c;无界的阻塞队列&#xff0c;就意味着会有内存溢出的风险。 FixedThreadPool: 适用于任务量固定耗时长的…

Find My移动硬盘|苹果Find My技术与移动硬盘结合,智能防丢,全球定位

当今已经是数据的时代&#xff0c;各种东西需要保存下来的很多&#xff0c;电脑、手机等设备更换频率也快&#xff0c;确实每个人都需要一个自己的"数据库"&#xff0c;而移动硬盘无疑是最有性价比、最简单使用的选择。移动硬盘一直是我们生活中不可或缺的存储工具&a…

DevChat:VSCode中基于大模型的AI智能编程助手

#AI编程助手哪家好&#xff1f;DevChat“真”好用# 文章目录 1. 前言2. 安装2.1 注册新用户2.2 在VSCode中安装DevChat插件2.3 设置Access Key 3. 实战使用4. 总结 1. 前言 DevChat是由Merico公司精心打造的AI智能编程助手。它利用了最先进的大语言模型技术&#xff0c;像人类…

WebSocketClient objects are not reuseable

好久没写东西&#xff0c;夜深了来冒个泡&#xff0c;先啰嗦几句。今天测试 Android App 的时候&#xff0c;发现推到后台不到一分钟再唤醒直接闪退&#xff0c;初次以为网络和GPS信号弱导致的&#xff08;当时是在地铁上进行的测试&#xff09;&#xff0c;之后在网络与GPS 信…

IDEA在service面板中不显示微服务的项目

在.idea文件夹下的workspace文件中的project标签内添加如下代码段&#xff0c;&#xff0c;重启idea即可看到所有服务出现在了service面板中 <component name"RunDashboard"><option name"configurationTypes"><set><option value&q…

干货来袭 只需套用模板就能制作的电子相册的网站

随着科技的不断发展&#xff0c;电子相册已经成为了我们生活中不可或缺的一部分。但是&#xff0c;制作电子相册的过程却往往让人感到头疼。那么&#xff0c;有没有一种简单易用的方法来制作电子相册呢&#xff1f;今天&#xff0c;就给大家介绍一款只需套用模板就能制作的电子…

opencv c++ canny 实现 以及与halcon canny的对比

Opencv和C实现canny边缘检测_opencv边缘增强-CSDN博客 一、canny实现步骤 1、图像必须是单通道的&#xff0c;也就是说必须是灰度图像 2、图像进行高斯滤波&#xff0c;去掉噪点 3、sobel 算子过程的实现&#xff0c;计算x y方向 、梯度&#xff08;用不到&#xff0c;但是…

使用springboot对Elasticsearch 进行索引的增、删、改、查

一 SpringBoot Elasticsearch 项目环境搭建 1.1 修改pom文件添加依赖 目前使用spring-boot-starter-parent版本为2.2.8.RELEASE 对应spring-data-elasticsearch版本为2.2.8.RELEASE&#xff0c;版本对应可以自行百度&#xff0c;如果不行直接用elasticsearch-rest-high-lev…

FlinkCDC系列:数据同步对部分字段的处理,只更新部分字段

在flinkCDC源数据配置中&#xff0c;只对表中的部分字段关注&#xff0c;通过监控部分字段进行数据更新或者不更新&#xff0c;对数据进行同步。主要通过以下两个参数&#xff1a; column.exclude.list 默认: 空字符串 一个可选的、以逗号分隔的正则表达式列表&#xff0c;与…

预安装win11的电脑怎么退回正版win10?

对于新购的笔记本 通常来讲预装的系统是全新安装的&#xff0c;是没有之前Windows10系统文件的&#xff0c;无法回退。 可以打开设置-----系统----恢复-----看下是否有该选项。 ------------------------------------------------------------------------------- 若是在上述…

Vue.js中的双向数据绑定(two-way data binding)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Redis统计大法:挖掘数据的四重宝藏【redis第五部分】

Redis统计大法&#xff1a;挖掘数据的四重宝藏 前言第一&#xff1a;redis集合统计简介第二&#xff1a;聚合统计->数据的综合分析总和&#xff08;Sum&#xff09;&#xff1a;平均值&#xff08;Average&#xff09;中位数&#xff08;Median&#xff09; 第三&#xff1a…

RuoYi若依源码分析1 - security

Security springsecurity配置文件夹 security springsecurity总配置类 SecurityConfig.java SecurityConfig 总配置分析 首先看一下总配置&#xff0c;我们可以从总配置项里面大体的总结出springsecurity鉴权在ruoyi框架里面是如何执行的 自动装配关键处理类以及过滤器等…

oracle 将数据库中聚合的id按指定的符号分割后合并为一列

在这里插入图片描述 数据库中存在这样的数据是clob字段并且是多个先将其拆分聚合为一列成 SELECT distinct REGEXP_SUBSTR(to_char(p.ids), [^;], 1, LEVEL) AS id FROM xxxxx p CONNECT BY REGEXP_SUBSTR(to_char(p.ids), [^;], 1, LEVEL) IS NOT NULL

力扣第62题 不同路径 c++ 动态规划 dp二维 + dp一维 解法

题目 62. 不同路径 中等 相关标签 数学 动态规划 组合数学 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Fini…

【QT】鼠标常用事件

新建项目 加标签控件 当鼠标进去&#xff0c;显示【鼠标进入】&#xff0c;离开时显示【鼠标离开】 将QLable提升成自己的控件&#xff0c;然后再去捕获 添加文件 改继承的类名 提升类 同一个父类&#xff0c;可以提升 效果 现在代码就和Qlabel对应起来了。 在.h中声明&…

Android与IOS渲染流程对比

目录 Android CPU计算图元信息 GPU干预 几何阶段等后处理 Android APP通过WindowManager统一提供所有Surface的缓冲区【不管是SurfaceView还是普通的布局流程都会将数据提交到Surface的BufferQuene中】 Java中的Surface是null&#xff0c;最终都是由Native层的Surface处理。…

科研迷雾:读研以来,我发现的科研界“怪象”

1 引言 随着读论文和做实验的增多&#xff0c;我发现了sci的很多猫腻经不起细细推敲&#xff0c;原来科研并不如我想象的神圣&#xff0c;还不如工业界来的实在&#xff0c;因为在工业界做项目出现问题&#xff0c;客户是验收不了不给付钱的。所以论文只是一个玩具。 2 常见的…

大数据预处理与采集实验三:Urllib的GET和POST请求(1)

目录 Urllib基本操作-GET ➢没有进行utf-8编码的输出 ➢经过utf-8decode之后的输出 ➢ Timeout参数&#xff1a;捕获由于连接超时而引发的异常 ◆Urllib基本操作-定制请求头 ➢ 在GET请求中加入多个访问参数 ◆Urllib基本操作-POST ➢有道词典网页爬取&#xff1a;找到…