单调递增的数字

单调递增的数字

思路

这个思路我是想不到,想到了就很容易实现了。

一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9

此时是从前向后遍历还是从后向前遍历呢?

从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。

那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299

确定了遍历顺序之后,那么此时局部最优就可以推出全局,找不出反例,试试贪心。

求解

1
2
3
4
5
6
7
8
9
10
11
12
var monotoneIncreasingDigits = function(n) {
let str = n.toString().split('')
for(let i=str.length-1;i>0;i--){
if (str[i]<str[i-1]){
str[i-1]--
for(let j=i;j<str.length;j++){
str[j] = 9
}
}
}
return parseInt(str.join(''))
};