主要内容
贪心题目
738.单调递增的数字
思路分析
如果第i位不满足,就把这位减去1,后面都变成9
需要从右向左遍历,比如332的情况 从左向右变为332->329不满足,从右向左332—>329->299
代码
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
# 如果第i位不满足,就把这位减去1,后面都变成9
# 需要从右向左遍历,比如332的情况 从左向右变为332->329不满足,从右向左332—>329->299
if n < 10:
return n
nl = []
while n > 0 :
nl.append(n % 10)
n //= 10
nl = nl[::-1]
# 标记从哪位开始都变为9
flag = len(nl)
for i in range(len(nl)-1,0,-1):
if nl[i-1] > nl[i]:
nl[i-1] -= 1
flag = i
nl = nl[:flag] + [9]*(len(nl)-flag)
res = 0
a = 10 ** (len(nl) - 1)
for i in range(len(nl)):
res += nl[i] * a
a /= 10
return int(res)
968.监控二叉树 (可以跳过)
思路分析
从下向上考虑,即从叶子节点开始考虑,后序遍历,左右中
考虑三种情况:
0:节点无覆盖 1:节点有摄像头 2:节点有覆盖
空节点返回 2
若左右均有覆盖,父节点返回0,表示无覆盖
若左右存在无覆盖,父节点返回1,摄像头数+1
若左右存在摄像头,父节点返回2
最后看根节点是否需要摄像头
代码
class Solution:
# 从下向上考虑,即从叶子节点开始考虑,后序遍历,左右中
# 考虑三种情况:
# 0:节点无覆盖 1:节点有摄像头 2:节点有覆盖
# 空节点返回 2
# 若左右均有覆盖,父节点返回0,表示无覆盖
# 若左右存在无覆盖,父节点返回1,摄像头数+1
# 若左右存在摄像头,父节点返回2
# 最后看根节点是否需要摄像头
def __init__(self):
self.res = 0
def minCameraCover(self, root: Optional[TreeNode]) -> int:
if self.traversel(root) == 0:
self.res += 1
return self.res
def traversel(self, node):
# 0:节点无覆盖 1:节点有摄像头 2:节点有覆盖
# 空节点返回 2
if not node:
return 2
left = self.traversel(node.left)
right = self.traversel(node.right)
# 若左右均有覆盖,父节点返回0,表示无覆盖
if left == 2 and right == 2:
return 0
# 若左右存在无覆盖,父节点返回1,摄像头数+1
if left == 0 or right == 0:
self.res += 1
return 1
# 若左右存在摄像头,父节点返回2
if left == 1 or right == 1:
return 2
return -1