0
点赞
收藏
分享

微信扫一扫

代码随想录算法训练营第三十七天| 738.单调递增的数字 , 968.监控二叉树 (跳过)

开源分享 2024-03-12 阅读 8

738.单调递增的数字

- LeetCode

思路: 给定一个数字, 要求返回小于这个数字的最大的单调递增数字, 即每个数字的后一位一定大于或等于前一位。 首先想到如果是两位数, 且前一位大于后一位, 例如 21, 那么首位肯定不能是2 了, 要减去一个变成 1, 后一位只要不是0都满足条件, 那么最大的肯定是9了。 同理 10 -> 09 (但是注意这里开头不能是0). 如果是三位数或者更多位数, 发现前一个数字大于后一个, 例如 321, 首先21是 19, 但是319 不符合条件, 3 > 2, 所以3 要减一, 然后后面的都是99 满足最大的。 所以贪心算法就很明确了。

难点: 理清楚变化的逻辑就可以了

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        if n < 10:
            return n
        nums = [*str(n)][::-1]
        n = len(nums)
        for i in range(1, n):
            if nums[i] > nums[i-1]:
                nums[i] = str(int(nums[i])-1)
                nums = ['9'] * i + nums[i:]
        if nums[-1] == '0':
            nums = nums[:-1]
        ans = int(''.join(nums[::-1]))
        return ans

 968.监控二叉树 (跳过)

- LeetCode

思路: 这个问题有点难的, 这次就先跳过了, 之后有时间再回过来看。

回顾

代码随想录

举报

相关推荐

0 条评论