Leetcode 738. 单调递增的数字(Java实现 超详细注释!)

Leetcode 738. 单调递增的数字

又又又是贪心呀!很好理解的一种方法,加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!

class Solution {
    public int monotoneIncreasingDigits(int N) {
        // 将整数转成一个字符数组,方便遍历
        char[] N_str = Integer.toString(N).toCharArray();
        // i之前(含i)的最大值(有什么用后面会详细说明)
        int max = -1;
        // i之前(含i)的最大值的索引(有什么用后面会详细说明)
        int max_index = -1;
        // 遍历数组
        for(int i = 0; i < N_str.length - 1; i++){
            // 找到当前i前面的最大值以及其索引
            if (N_str[i] > max){
                max = N_str[i];
                max_index = i;
            }

            // 若发现前一个数大于后一个数,说明递减了,我们需要改动数组,怎么改动呢
            // 此时有两种情况:

            /**1.一种是数组截止到i之前,全部小于i的值,那没有任何犹豫的
            直接N_str[i] -= 1,再将i后面的全部置位9,根据贪心的思想,此时数组构成的整数就是递增且最大的*/

            /**2.另一种情况是截止到i之前,有索引位置的值等于i的值(只可能是等于,否则遍历不到i),并且等于索引i处的值的索引可能不止一个
            这时候我们之前找到的i之前的最大值就有用了,注意我们这里的最大在这种情况下一定满足两个条件:
            1)最大值一定等于i的值;2)并且是最前面的,因为后面等于i,索引不会发生更新*/
            // 既然满足这个条件那我们继续按照贪心的思想,就是应该将最前面且等于i的值 的那个索引 的值(有点绕,哈哈)减1,并且将后面全部置9

            /**
            巧合就在于,两种情况的最大值的索引其实都是max_index;
            第一种情况下,i之前(含i)的最大值的索引必然就是i了,因此可以直接N_str[max_index] -= 1 && max_index后面的元素全部置为9
            第二种情况下同样是N_str[max_index] -= 1 && max_index后面的元素全部置为9
            因此我们可以合并这两种情况;
            */

            if (N_str[i] > N_str[i + 1]){
                N_str[max_index] -= 1;
                for (int idx = max_index + 1; idx < N_str.length; idx++){
                    N_str[idx] = '9';
                }
                // 此时N_str数组构成的整数就已经是最大且递增的了,我们可以停止for循环
                break;
            }
        } 
        return Integer.parseInt(new String(N_str));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值