给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1:
输入: N = 10
输出: 9
示例 2:
输入: N = 1234
输出: 1234
示例 3:
输入: N = 332
输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits
参考:
python
# 0738.单调递增的数字
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
"""
朴素求解,暴力解法,通过取模依次取到低位数字,高位数字应该小于等于低位数字
:param N:
:return:
"""
def checkNum(num: int) -> bool:
"""判断单调递增的数字,高位小于等于低位数字"""
max = 10
while num :
t = num % 10
if max >= t:
max = t
else:
return False
num = num // 10
return True
for i in range(n, 0, -1):
if checkNum(i):
return i
return 0
class Solution1:
def monotoneIncreasingDigits(self, n: int) -> int:
"""
由后向前遍历,后面的可以用上,如98,由于9大于8,9-1变8,同时个位8变9,此时就是最大的递增数字
或者如332,由于十位3大于个位2,十位变2,个位变9,同理百位变2,十位2变9,最后就是299
:param n:
:return:
"""
num_list = list(str(n))
for i in range(len(num_list)-1, 0, -1):
if int(num_list[i]) < int(num_list[i-1]):
num_list[i-1] = str(int(num_list[i-1])-1)
num_list[i:] = "9" * (len(num_list)-i)
return int("".join(num_list))
if __name__ == "__main__":
test = Solution()
print(test.monotoneIncreasingDigits(332))
golang
package greedy
import (
"strconv"
)
// 贪心算法
func monotoneIncreasingDigits(n int) int {
stringNum := strconv.Itoa(n)
// bytes类型的值为对应ascii的对应数
strNumArr := []byte(stringNum) // go中string不可变类型,转为数组方便更改
length := len(strNumArr)
if length <= 1 {
return n
}
for i:=length-1;i>0;i-- {
if strNumArr[i-1] > strNumArr[i] {
strNumArr[i-1] -= 1
for j:=i;j<length;j++ { // 后面的数置为9
strNumArr[j] = '9'
}
}
}
res,_ := strconv.Atoi(string(strNumArr))
return res
}