题目:
题解一:贪心
题目要求小于等于n的最大单调递增的整数,先进行举例:
例如:98,一旦出现num[i-1] > num[i] 的情况,既非单调,应该把num[i-1]--,num[i] 变成9,既结果为89,小于98的最大单调递增整数为89。
最优:遇到num[i-1] > num[i],让num[i-1]--,然后num[i]赋值9,可以保证得到最大的递增整数。
public int monotoneIncreasingDigits(int n) {
char[] chars = Integer.toString(n).toCharArray();
int startIndex = chars.length;
for (int i = chars.length - 1; i > 0; i--) {
if (chars[i-1] > chars[i]) {
chars[i-1] --;
startIndex = i;
}
}
for (int i = startIndex; i < chars.length; i++) {
chars[i] = '9';
}
return Integer.parseInt(new String(chars));
}
时间复杂度:O(n)
题解二:暴力求解
循环判断每一位数是否满足递增,找到一个就返回。
public int monotoneIncreasingDigits(int n) {
while (true) {
if (isIncrease(n)) {
return n;
}
n--;
}
}
private boolean isIncrease(int n) {
int pre = 10;
while (n != 0) {
int temp = n % 10;
if (temp > pre) {
return false;
}
pre = temp;
n = n / 10;
}
return true;
}
时间复杂度:O(n*m) m 为 n 的数字长度