代码随想录 Day-36|#738 单调递增的数字 |#968 监控二叉树

清单

● 738.单调递增的数字
● 968.监控二叉树

LeetCode #738 单调递增的数字

1. 题目

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

2. 思路

初始思路:从右向左遍历非负整数,若当前元素大于前一元素,则当前元素的值-1。且从左向右边遍历时,将变更元素后的值全部更改为9。

3. 代码实现

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        a = list(str(n))
        for i in range(len(a)-1,0,-1):
            if a[i-1] > a[i]:
                a[i-1] = str(int(a[i-1]) - 1)
                for j in range(i,len(a)):
                    a[j] = '9'
        return int(''.join(a))

LeetCode #968 监控二叉树

1. 题目

给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量

2. 思路

若从上往下遍历,头节点处是否放摄像头仅能确定是否减少一颗摄像头数量,若从下往上遍历,在每个叶子节点的父节点处放置摄像头,则可以覆盖上中下三层。从局部最优——>整体最优。

3. 代码实现

class Solution:
    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        result = [0]
        if self.travel(root,result) == 0:
            result[0] += 1
        return result[0]

    def travel(self, cur, result):
        if not cur:
            return 2
        
        left = self.travel(cur.left, result)
        right = self.travel(cur.right, result)

        if left == 2 and right == 2:
            return 0
        
        if left == 0 or right ==0:
            result[0] += 1
            return 1

        if left == 1 or right == 1:
            return 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值