738.单调递增的数字
1.题目
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
2.实现
写的有点慢,但思路是想出来了
在清楚思路后,建议把思路想的本质点、通俗点,不要那么多if判断
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
a = list(str(n))
for i in range(len(a)-1,0,-1):
if int(a[i]) < int(a[i-1]):
a[i-1] = str(int(a[i-1]) - 1)
a[i:] = '9' * (len(a) - i)
return int("".join(a))
# # 从最高位开始遍历,如遇到递减,则前一位-1(可能导致退位),而后都另为9
# if n < 10:
# return n
# nums = []
# while n:
# nums.append(n % 10)
# n = n // 10
# nums = nums[::-1]
# m = len(nums)
# res = []
# for i in range(m - 1):
# res.append(nums[i])
# if nums[i] > nums[i + 1]:
# j = i
# while i > 0 and nums[i] == nums[i - 1]: # 退位到当前i,且比前面一个大
# nums[i] -= 1
# res[i] = 9
# i -= 1
# nums[i] -= 1 # 对最前面一个相等值-1
# res[i] -= 1
# res.extend([9]*(m - j - 1))
# break
# if i == m - 2:
# res.append(nums[-1])
# total = 0
# for i in range(m):
# if res[i] != 0:
# total += res[i] * (10 ** (m - i - 1))
# return total
3.技巧:
python得到一个数的数位:
a = list(str(n)) 接下来基于字符去比较时,需转化为int整型
968.监控二叉树
题目一刷太难了
自己想了思路但没考虑完全
重刷哦!
贪心算法总结
思路:如果找出局部最优并可以推出全局最优,就是贪心,如果局部最优都没找出来,就不是贪心,可能是单纯的模拟。
值得二刷理解思路:
1)两个维度权衡问题
2)贪心解决区间问题(重叠区间)