当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10 输出: 9
示例 2:
输入: n = 1234 输出: 1234
示例 3:
输入: n = 332 输出: 299
提示:
0 <= n <=
关键词:贪心,数学
思路:为了方便比较,先把原数各位置上的数分解成单个数字存储在数组中。从低位向高位遍历,如果当前位(低位)的数字小于前一位(高位)的数字,将当前位的数字改成9,。需要注意的是,既然这一位改成9了,那么为了保证单调递增的特性,当前位之前(更低位)的所有位置的数字也要全部改成9。如此遍历完一遍后,得到的数组就是最终结果的各位数字。之后再把每位数字取出来变成最终结果就行了。
需要注意的是,n=0需要单独处理。另外类型开long,不然会溢出。
题解如下:
class Solution {
public:int monotoneIncreasingDigits(int n) {vector<long> digits;while(n != 0) {digits.push_back(n % 10);n /= 10;}if(digits.size() == 0) return 0;for(int i = 0; i < digits.size() - 1; i++) {if(digits[i] < digits[i+1]) {for(int j = i; j >= 0; j--) digits[j] = 9;digits[i+1] -= 1;}}long flag = 1,res = 0;for(int i = 0; i < digits.size(); i++) {res += digits[i] * flag;flag *= 10;}return res;}
};