2道题目
738. 单调递增的数字
968. 监控二叉树
解题理解
738
直接写的暴力,果然超时了,正确思路的核心逻辑就一个,即找到最左边的非递增数字,然后-1,从他之后每个数字都置为9。
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
str_num = str(n)
flag = len(str_num)
for i in range(len(str_num) - 1, 0, -1):
if str_num[i - 1] > str_num[i]:
flag = i
str_num = str_num[: i - 1] + str(int(str_num[i - 1]) - 1) + str_num[i: ]
for i in range(flag, len(str_num)):
str_num = str_num[: i] + '9' + str_num[i + 1 : ]
return int(str_num)
968
这道题完全想不出来,甚至都看不出来是贪心解法。
class Solution:
def __init__(self):
self.count = 0
def backtrack(self, root):
if not root:
return 2
left = self.backtrack(root.left)
right = self.backtrack(root.right)
//约定:
//0:未覆盖
//1:有摄像头
//2:有覆盖
if (left == 2 and right == 2):
//此处的判断条件有很多,但可以被精简为一行:
// left == 0 && right == 0 左右节点无覆盖
// left == 1 && right == 0 左节点有摄像头,右节点无覆盖
// left == 0 && right == 1 左节点有无覆盖,右节点摄像头
// left == 0 && right == 2 左节点无覆盖,右节点覆盖
// left == 2 && right == 0 左节点覆盖,右节点无覆盖
return 0
if (left == 0 or right == 0):
self.count += 1
return 1
if (left == 1 or right == 1):
//判断0和判断1的条件顺序不能反,因为判断0的条件中包含着1的情况
// left == 1 && right == 2 左节点有摄像头,右节点有覆盖
// left == 2 && right == 1 左节点有覆盖,右节点有摄像头
// left == 1 && right == 1 左右节点都有摄像头
// 其他情况前段代码均已覆盖
return 2
return - 1
def minCameraCover(self, root: Optional[TreeNode]) -> int:
if self.backtrack(root) == 0:
self.count += 1
return self.count