代码随想录 738.单调递增的数字

方法一:暴力(超时)

java 复制代码
class Solution {
    //判断一个数字的各位上是否是递增
    boolean checkNum(int num){
        int max = 10;
        while(num != 0){
            int t = num % 10;
            if(max >= t){
                max = t;
            }else{
                return false;
            }
            num = num/10;
        }
        return true;
    }
    public int monotoneIncreasingDigits(int n) {
        for(int i = n;i > 0;i --){ //从大到小遍历
            if(checkNum(i)){
                return i;
            }
        }
        return 0;
    }
}

方法二:贪心。

思路:

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

2.遍历顺序:举个例子,332,如果从前向后遍历,则为329,此时2又小于第一位的3了,真正的结果应该是229。因此应该从后向前遍历,这样可以重复利用上次比较得出的结果。从后向前遍历332的数值变化为:332 -> 329 -> 229。

3.确立了遍历顺序后,此时局部最优可以推出全局最优,找不出反例,试试贪心。

函数解释:String.join(分隔符,字符串数组或集合)。

第一个参数"":分隔符,这里使用空字符串,表示元素之间不加任何分隔符。

第二个参数strings:表示要连接的字符串数组。

附代码:

java 复制代码
class Solution {
    public int monotoneIncreasingDigits(int n) {
        //将整数n转换为字符串数组,每个元素对应数字的一位
        String[] strings = (n + "").split("");
        int start = strings.length;
        for(int i = strings.length - 1;i > 0;i--){
            //将字符串转换为整数
            if(Integer.parseInt(strings[i]) < Integer.parseInt(strings[i - 1])){
                //将整数转换为字符串
                strings[i - 1] = (Integer.parseInt(strings[i - 1]) - 1) + "";
                start = i;
            }
        }
        for(int i = start;i < strings.length;i++){
            strings[i] = "9";
        }
        //将字符串数组拼接成一个完整的字符串,然后转换为整数返回
        //""表示将字符串数组中的所有元素用空字符串连接起来(""表示空字符串,即直接拼接),并将拼接后的字符串解析为整数
        return Integer.parseInt(String.join("",strings));
    }
}

上述方法中创建了String数组,多次使用了Integer.parseInt方法,这导致不管是耗时还是空间占用都非常高,用时12ms。可以在char数组上原地修改,耗时1ms。

java 复制代码
class Solution {
    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));
    }
}
相关推荐
BD4SXV28 分钟前
线性二次调节器(Linear Quadratic Regulator,LQR)的无限时域最优控制求解与黎卡提方程
算法·自动化
ST——Jess36 分钟前
2026年度传统文化数字化与命理科技(Ethno-tech)行业趋势研究报告:专业级数智工作台的技术壁垒与评测标准
人工智能·科技·算法·架构
Matrix_111 小时前
第13篇:非线性位移场——漩涡、鱼眼、水波纹与球面化
图像处理·算法
Lucky_ldy1 小时前
数据结构从入门到精通:顺序表
数据结构·链表
金牌归来发现妻女流落街头1 小时前
【LeetCode 第207题】
算法·leetcode·拓扑·领接表
熬夜敲代码的猫1 小时前
AVL树(C++详解版)
数据结构·c++·算法
-To be number.wan1 小时前
算法日记 | STL-MAP
c++·算法
cjp5601 小时前
015. UG 二次开发,拉伸草图生成实体类,高级草图类封装
算法
Eric 辰东2 小时前
【C 语言程序的编译和链接】详解编译链接过程
c语言·笔记·算法·学习方法
并不喜欢吃鱼2 小时前
从零开始 C++-----十一【C++ 数据结构】红黑树全解析:从定义到工程实现(一文搞定,十分详细)
开发语言·数据结构·c++