Day 35 贪心算法 part06

Day 35 贪心算法 part06

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值