代码随想录算法营Day36 | 56. 合并区间,738. 单调递增的数字,968. 监控二叉树

56. 合并区间

每当遇到不重叠的区间就append到结果数组里,遇到重叠的就更新结果数组最后一位的区间的end值。

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort()
        res = []
        for start,end in intervals:
            if len(res) != 0 and start <= res[-1][-1]:
                res[-1][-1] = max(end,res[-1][-1])
            else:
                res.append([start,end])
        return res

738. 单调递增的数字

这道题先将数字转成字符列表,然后从后向前遍历该列表,如果i-1的数字大于i的值,我们就对j-1上的数字减去1并且将i更新为新的flag,最后将flag及之后的数字都改成9以维护最大递增的性质。

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

968. 监控二叉树

这道题要让监控最小就是要让那些叶子节点的父节点上安装摄像头。如此我们会有三种节点状态:未覆盖uncovered(0),有摄像头hasMoniter(1),覆盖covered(2)。为了让我们由下至上的去处理节点,我们选用后序遍历左右中,根据左右节点的情况来判断当前节点的情况,如果左右节点有一个是未覆盖状态,那么当前节点就该有摄像头并且增加摄像头数量,如果左右节点有一个有摄像头,那么当前节点就应该是覆盖状态,如果左右节点都是覆盖状态,那么当前节点就应当为未覆盖状态。最后判断一下根节点的状态是否为未覆盖状态,如果是则摄像头数量加1.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        res = 0
        uncovered = 0
        hasMoniter = 1
        covered = 2
        def traverse(cur):
            nonlocal res
            if not cur:
                return covered
            left = traverse(cur.left)
            right = traverse(cur.right)
            if left == uncovered or right == uncovered:
                res += 1
                return hasMoniter
            if left == hasMoniter or right == hasMoniter:
                return covered
            if left == covered and right == covered:
                return uncovered
        if traverse(root) == uncovered:
            res += 1
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值