力扣738-单调递增的数组(Java详细题解)

题目链接:738. 单调递增的数字 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。

贪心方法:局部最优推出全局最优。

如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。

题目思路:

本题要求我们单调递增的数字,那么我们怎么修改一个数字为单调递增的数字呢?

其实由案例也可以看出,当前一个数位的数值小于后一个数位的数值,我们应该让前一个数位的数值减1,后一个数值直接改为9即可。

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

局部最优就是:当前一个数位的值小于后一个数位时,将前一个数位的值减一,并让后一个数位的值赋为9。

全局最优:得到一个<n最大的单调递增的数字。

思路很简单,但是代码实现有些困难,具体细节我们放最终代码中讲。

java 复制代码
class Solution {
    public int monotoneIncreasingDigits(int n) {
        //我们要注意一些代码的细节 灵活使用java的api
        //将数字转化为字符串 由于Java字符串不能修改 我们最好将其转化为字符数组进行操作
        String s = String.valueOf(n);
        char[] temp = s.toCharArray();
        //为什么这里要有一个 flag 并且 初始化为 temp的最大值呢?
        //这个flag其实就是控制要转化为数值9起始位置。
        int flag = temp.length;
        //注意这里为什么是后序遍历 而且i > 0呢?
        //后序遍历是因为,当332进行处理时,我们百位或者是十位都需要个位处理的结果。因为后一位发现小与上一位才会让上一位减1,并让后面赋值为9.如果前序遍历的话就会变成329 具体大家可以模拟一下
        //i > 0是因为当i取 1时 我们要让i = 0与i = 1进行比较,如果i >= 0的话 i取0 那么他就会和i = -1相比较 所以i > 0是为了防止数组不越界。
        for(int i = temp.length - 1;i > 0;i--){
            //当前遍历的数值小与前一位的数值后,让前一位的数值减一,让flag记录改为9的起始位置
            //那么这里肯定会有人想,这里我直接让temp[i] = 9,不就完了吗。其实不然 
            //以1000为例 模拟一下 当i = temp.length - 1 他与上一位对比 发现并不小于 最后俩位都没修改 还是0
            //所以这样得到的结果就是900 与实际结果999发现还是不同,所以我们需要一个指针来指向我们要修改为9的起始位置,只要当前数位的数值小于上一个数位的值,那么后面所有数位的值全改为9.
            if(temp[i] < temp[i - 1]){
                temp[i - 1]--;
                flag = i;
            }
        }
        for(int i = flag;i < temp.length;i ++){
            temp[i] = '9';
        }
        //parseInt 是将字符串转化为数字
        return Integer.parseInt(String.valueOf(temp));
    }
}

虽然这道题思路蛮简单,但是处理代码的细节还是有些多,大家多多体会。

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

相关推荐
_Evan_Yao2 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd2 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼2 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122663 小时前
TCP 1
java·1024程序员节
企业数字化笔记5 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
金銀銅鐵5 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
?abc!6 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
AI人工智能+电脑小能手6 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck7 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428048 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis