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
思路: 这个问题有点难的, 这次就先跳过了, 之后有时间再回过来看。
回顾
代码随想录