代码随想录算法训练营第三十七天|738.单调递增的数字 968.监控二叉树 总结

2023-09-17 22:23:58

 738.单调递增的数字 

代码随想录

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。

那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299
 

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

 968.监控二叉树 (可以跳过)

本题是贪心和二叉树的一个结合,比较难,一刷大家就跳过吧。 

代码随想录

 总结 

可以看看贪心算法的总结,贪心本来就没啥规律,能写出个总结篇真的不容易了。 

代码随想录

贪心简单题

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

#贪心中等题

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

#贪心解决股票问题

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

#两个维度权衡问题

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

在讲解本题的过程中,还强调了编程语言的重要性,模拟插队的时候,使用C++中的list(链表)替代了vector(动态数组),效率会高很多。

所以在贪心算法:根据身高重建队列(续集) (opens new window)详细讲解了,为什么用list(链表)更快!

贪心难题

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

#贪心解决区间问题

关于区间问题,大家应该印象深刻,有一周我们专门讲解的区间问题,各种覆盖各种去重。

#其他难题

贪心算法:最大子序和 (opens new window)其实是动态规划的题目,但贪心性能更优,很多同学也是第一次发现贪心能比动规更优的题目。

贪心算法:加油站 (opens new window)可能以为是一道模拟题,但就算模拟其实也不简单,需要把while用的很娴熟。但其实是可以使用贪心给时间复杂度降低一个数量级。

最后贪心系列压轴题目贪心算法:我要监控二叉树! (opens new window),不仅贪心的思路不好想,而且需要对二叉树的操作特别娴熟,这就是典型的交叉类难题了。

更多推荐

数据分析与可视化项目技术参考

🙌秋名山码民的主页😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪🎉欢迎关注🔎点赞👍收藏⭐️留言📝获取源码,添加WX目录1.考核的主要内容2.具体实现流程3.技术参考3.1数据获取3.2数据清洗与处理3.3数据存储到Mysql3.4网站开发3.4.1登录页面3.4.2数据可视化

数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

SQLSERVER数据库故障类型:1、SQLSERVER数据库文件被删除。2、SQLSERVER数据库所在分区格式化。3、SQLSERVER数据库文件大小变为“0”。4、使用备份还原数据库时覆盖原数据库。SQLSERVER数据库故障原因:1、人为误操作。2、文件系统损坏,设备自动做磁盘检测。SQLSERVER数据库故障

【Spring Boot】Spring Boot源码解读与原理剖析

这里写目录标题前言精进SpringBoot首选读物“小册”变“大书”,彻底弄懂SpringBoot全方位配套资源,学不会来找我!技术新赛道,2023领先抢跑前言承载着作者的厚望,掘金爆火小册同名读物《SpringBoot源码解读与原理剖析》正式出书!本书前身是掘金社区销量TOP的小册——《SpringBoot源码解读与

shell循环和函数

目录1.for循环2.while循环3.until循环4.函数5.特殊流程控制语句1.for循环for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种:语法一for变量in值1值2值3…(可以是一个文件等)do程序done这种语法中for循环的次数,取决于

ARTS 打卡 第二周,按部就班

引言认识三掌柜的想必都知道,我持续创作技术博客已经有6年时间了,固定每个月发布不少于6篇博文。同时,自己作为一名热爱分享的开发者,像ARTS这样的活动自然少不了我。由于我是打算挤在一起分享,之前都是做了本地文档记录,所以直接把内容整合起来即可,那么接下来就开启我的第二周打卡咯。Algorithm本周分享的算法题是力扣(

400电话怎么办理(申请开通)

申请开通400电话是一项相对简单的过程,只需按照以下步骤进行操作即可。第一步,选择400电话服务提供商。在市场上有很多公司提供400电话服务,您可以根据自己的需求和预算选择适合的服务商。可以通过搜索引擎、咨询朋友或者查看相关论坛等方式获取一些可靠的服务商名单。第二步,了解服务商的费用和服务内容。不同的服务商提供的费用和

消息中间件大揭秘:选择之前你必须知道的关键信息

Hello大家好!我是小米,很高兴再次和大家见面!今天的话题非常精彩,我们将深入探讨消息中间件,并了解一些常见的消息队列:RabbitMQ、RocketMQ、Kafka以及Redis。如果你正在准备面试,或者只是对这些消息中间件感兴趣,那么这篇文章一定会对你有所帮助。什么是消息中间件?首先,让我们来了解一下什么是消息中

RTU遥测终端机,提升水资源管理效率!

2023年水利部发布的《关于推进水利工程配套水文设施建设的指导意见》,强调要聚焦保障水利工程安全高效运行、完善风险监测预警体系、提高防灾减灾能力和水资源水环境水生态综合治理能力、推动新阶段水利高质量发展的要求,加强水利工程配套水文设施建设。遥测终端机在现代水利行业中扮演着重要的角色,可以有效地监测、收集和传输水文数据,

JVM——11.JVM小结

这篇文章我们来小结一下JVMJVM,即java虚拟机,是java代码运行时的环境。我们从底层往上层来说,分别是硬件部分,操作系统,JVM,jre,JDK,java代码。JVM是直接与操作系统打交道的。JVM也是java程序一次编到处运行的主要原因。JVM主要就是讲了一句话,即“Studenta=newStudent()

VScode调试复杂C/C++项目

以前都是用的VScode调试c/cpp的单个文件的编译和执行,但是一遇到大型项目一般就用gdb了,gdb的调试效率和VScode差距还是比较大的,但最近发现VScode其实也能调试复杂的cpp项目,所以记录一下.首先明确一下几点:首先cpp文件需要经过编译,生成可执行文件,然后通过运行/调试可执行文件达到我们想要的效果

OJ练习第175题——打家劫舍 II

打家劫舍II力扣链接:213.打家劫舍II题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负

热文推荐