当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
思考:首先可以想到的是暴力解法:通过不断减少数字的值来进行判断 时间复杂度n*m
class Solution {
public int monotoneIncreasingDigits(int n) {
for (int i = N; i > 0; i--) { // 从大到小遍历
if (checkNum(i)) {
return i;
}
}
return 0;
}
private booloan check(int num){
int max =10;
while(num!=0){
int t = num%10;
if(max>=t) {
max=t;
}else{
return false;
}
num = num/10;
}
return true;
}
时间复杂度无法通过;
新的思考: 数字一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,
还考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。
class Solution {
public int monotoneIncreasingDigits(int N) {
//将数字转化成字符数组
String numstr = String.valueOf(N);
char[] chars = numstr.toCharArray();
//定义开始需要变9的位置
int start = chars.length;
//由后向前开始遍历
for(int i=chars.length-2;i>=0;i--){
//判断当前数大于后数时需要将 后数置为9 前数减1
if (chars[i] > chars[i + 1]) {
chars[i]--;
start = i+1;
}
}
for(int i =start ;i<chars.length;i++){
chars[i]='9';
}
return Integer.parseInt(String.valueOf(chars));
}
}