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

简介: 代码随想录算法训练营第三十六天 | 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. 监控二叉树,不仅贪心的思路不好想,而且需要对二叉树的操作特别娴熟,这就是典型的交叉类难题了。
相关文章
|
7天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
18天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
19 3
|
17天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
23天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
17 0
|
25天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
10天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
11天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
12天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
11天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
11天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
29 3