leetcode中等738单调递增的数字

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等738单调递增的数字相关的知识,希望对你有一定的参考价值。


思路:贪心,局部最优推出全局最优

局部最优:遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]=9,可以保证这两位变成最大单调递增整数。

全局最优:得到小于等于N的最大单调递增的整数。

但还需要其他条件,即遍历顺序,和标记从哪一位开始统一改成9

eg :332,从前向后遍历的话,那么就变成了329,真正的结果应该是299。顺序遍历会改变已写好的部分,所以应当从后向前遍历

332的变化为:332 -> 329 -> 299

class Solution {
    public int monotoneIncreasingDigits(int n) {
        if (n==0)return 0;
        char[] chars= Integer.toString(n).toCharArray();
        int start=Integer.MAX_VALUE;//start初始值设为最大值,这是为了防止当数字本身是单调递增时,没有一位数字需要改成9的情况
        for (int i=chars.length-1;i>0;i--){
            if (chars[i]<chars[i-1]){
                chars[i-1]--;
                start=i;
            }
        }
        StringBuilder res=new StringBuilder();
        for (int i=0;i<chars.length;i++){
            if (chars[i]=='0'&&i==0)continue;//防止出现09这样的情况
            if (i>=start){
                res.append('9');
            }else res.append(chars[i]);
        }
        return Integer.parseInt(res.toString());
    }
}

以上是关于leetcode中等738单调递增的数字的主要内容,如果未能解决你的问题,请参考以下文章

738. 单调递增的数字(贪心算法)

力扣算法JS LC [56. 合并区间] LC [738. 单调递增的数字]

贪心算法第六篇:单调递增的数字 + 划分字母区间 + 合并线段区间

贪心算法第六篇:单调递增的数字 + 划分字母区间 + 合并线段区间

leetcode中等926将字符串翻转到单调递增

leetcode中等402移掉k位数字