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));
}
}