Day 35 贪心算法 part06

Day 35 贪心算法 part06

  • 解题理解
    • 738
    • 968

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

你可能感兴趣的:(贪心算法)