代码随想录刷题第三十七天| 738.单调递增的数字 ● 968.监控二叉树 ● 总结

本文介绍了编程问题的两个挑战:如何将非单调递增的数字转换为单调递增,以及如何在监控二叉树中确定最小摄像头覆盖策略。作者分享了相应的代码实现和思路分析。
摘要由CSDN通过智能技术生成

代码随想录刷题第三十七天

单调递增的数字 (LC 738)

题目思路:

本题也很难想到解法,从后往前如果后一位比前一位小,则不是递增数;将前一位减一,后一位变为九,使该数字变为单调递增数字,非常巧妙的思路

在这里插入图片描述

代码实现:

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        strNum = str(n)
        flag = len(strNum)

        for i in range(len(strNum)-1, 0, -1):
            if strNum[i-1]>strNum[i]:
                strNum = strNum[:i-1]+str(int(strNum[i-1])-1)+strNum[i:]
                flag = i
        strNum = strNum[:flag] + ''.join(['9' for _ in range(flag, len(strNum))])
        return int(strNum)

监控二叉树 (LC 968)

题目思路:

**本题巨难!!!需要想到三个状态 **

  • 0:该节点无覆盖
  • 1:该节点有摄像头
  • 2:该节点有覆盖

还需要想到4种状况,且终止条件是空节点为2

在这里插入图片描述
在这里插入图片描述

代码实现:

class Solution:
    def __init__(self):
        self.count = 0
    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        head = self.traversal(root)
        if head==0:
            root.val=1
            self.count+=1
        return self.count

    def traversal(self, root):
        if root is None:
            return 2

        left = self.traversal(root.left)
        right = self.traversal(root.right)

        if left==2 and right==2:
            return 0
        if left==0 or right==0:
            self.count+=1
            return 1
        if left==1 or right==1:
            return 2
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值