题目
当且仅当每个相邻位数上的数字 x
和y
满足 x
<= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10
输出: 9
示例 2:
输入: n = 1234
输出: 1234
示例 3:
输入: n = 332
输出: 299
提示:
-
解题方法
将整数
n
按位从高到低保存为数组,当连续两位i, i-1
出现nums[i-1] > nums[i]
时,通常的做法是对nums[i-1]
减1
,将nums[i]
置为9
,此时为了保证最后的数字最大,需要将i
以后的所有位都置为9
。因此从后向前遍历各位,记录需要置为9
的最高位,并将其后所有数字都置为9
。
时间复杂度O(n)
,空间复杂度O(1)
。
C++代码:class Solution {
public:
int monotoneIncreasingDigits(int n) {
int nums[10] = {0};
for(int i=9; i>=0; i--) {
nums[i] = n%10;
n /= 10;
}
int last = INT_MAX;
int result = 0;
for(int i=9; i>0; i--) {
if(nums[i-1]>nums[i]) {
nums[i-1]--;
last = i;
}
}
for(int i=0; i<10; i++) {
if(i<last) result = result*10 + nums[i];
else result = result*10 + 9;
}
return result;
}
};