当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10
输出: 9
示例 2:
输入: n = 1234
输出: 1234
示例 3:
输入: n = 332
输出: 299
从后向前遍历不断寻找 下标 i 的值小于 i-1 的情况(不符合递增),则让 i 的值减1,然后让 i 后面的值都变成9(贪心原则)。
用一个例子来看思路
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
遍历顺序是从前向后遍历还是从后向前遍历呢?
举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
temp = list(str(n))
for i in range(len(temp)-1,0,-1):
if int(temp[i]) < int(temp[i-1]):
temp[i-1] = str(int(temp[i-1])-1)
temp[i:] = '9' * (len(temp)-i)
return int(''.join(temp))