class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
nums = [int(i) for i in str(n)] #将数字转化为int列表
k = len(nums) - 1
flag = k + 1 #flag用来记录哪一位不满足条件,即从这一位开始 后面都赋值为9,因为取最大的
while(k > 0): #反向遍历该列表
if nums[k] >= nums[k - 1]: #如果后一位大于等于前一位,满足题目要求 continue
k -= 1
continue
else: #如果后一位小于前一位,那么将前一位减一,并记录当前位置,继续遍历
nums[k - 1] -= 1
flag = k
k -= 1
if flag == len(nums): #如果遍历完了发现flag没有变,那就return原数
return n
else: #flag变了,那就按顺序遍历该列表,从flag开始全都赋值为9
for i in range(len(nums)):
if i >= flag:
nums[i] = 9
if nums[0] == 0: #如果首位是0,那就去掉首位
nums = nums[1:]
return int(''.join(map(str, nums)))
class Solution:
def __init__(self):
self.result = 0
def minCameraCover(self, root: Optional[TreeNode]) -> int:
if self.traversal(root) == 0:
self.result += 1
return self.result
def traversal(self, root):
if not root:
return 1
left = self.traversal(root.left)
right = self.traversal(root.right)
if left == 0 or right == 0:
self.result += 1
return 2
if left ==2 or right == 2:
return 1
if left ==1 and right == 1:
return 0
思路: 定义每个节点的状态,通过后序遍历来判断每个头节点的状态。具体就是让叶子节点的头节点装摄像头 然后每隔两个装一个。
定义0为摄像头无覆盖的情况,1 有覆盖, 2 有摄像头。
三种情况:
1. 左右叶子节点有一个没有被覆盖,那么就要在头节点安装一个摄像头,并把头节点的状态设为2返回
2. 左右节点有一个有摄像头,那么其头节点一定是有覆盖的,返回1
3. 左右节点都是有覆盖的情况,那么头节点不用装摄像头,返回0
需要注意的问题:
引用问题:在 minCameraCover
方法中,如果试图将 result
作为参数传递给 traversal
函数。由于在 Python 中整数是不可变类型,因此您在 traversal
函数内部对 result
所做的更改不会反映到 minCameraCover
方法中的 result
上。解决这个问题的一种方法是使用类变量而不是方法参数。