leetcode(力扣) 738. 单调递增的数字 (贪心)

文章目录

  • 题目描述
  • 思路分析
  • 完整代码

题目描述

当且仅当每个相邻位数上的数字 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))

你可能感兴趣的:(个人笔记,交流学习,leetcode,python)