当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10 输出: 9
示例 2:
输入: n = 1234 输出: 1234
示例 3:
输入: n = 332 输出: 299
提示:
0 <= n <= 109
这个题也是非常经典了。其实开始局部最优解很好想,倒叙遍历n对应的数组,前一个元素大于后一位,就给后一位变成9,前一位-1。但是就卡在前一位-1的操作上了。如果前一个是0怎么办?是0并且是第一位怎么办?最后就因为这个0的问题将问题越搞越复杂。直到看了书,才发现此巧妙做法:倒叙遍历时,倘若发现前一个元素大于后一位,记录位置。因为遍历了整个数组,因此记录的位置其实是最靠左的左大于右。这样保证了全局的条件满足。然后在记录位置开始向后遍历,将所有元素变成9,前一位-1。返回数组整合的数组即可。
你也许会问,0呢?之前最难的部分怎么没提?这是因为在最后转化的时候,Integer.valueOf直接会将099转换成99,自动去除。101第一步变成199,减一变成099转换成99,问题解决!
代码如下:
class Solution {
public int monotoneIncreasingDigits(int n) {
char[] str = (""+n).toCharArray();
int flag = str.length;
for(int i=str.length-1;i>0;i--){
if(str[i] < str[i-1]){
flag = i;
str[i-1]--;
}
}
for(int i=flag;i<str.length;i++){
str[i] = '9';
}
return Integer.valueOf(new String(str));
}
}