代码随想录第37天| 738.单调递增的数字、 968.监控二叉树

85 阅读1分钟

738. 单调递增的数字

1. first idea

从个位开始,检查xi1x_{i-1}xix_i是否是升序,

  1. 如果不是,那么xi1>xix_{i-1}>x_i,所以应该减少xi1x_{i-1}使得xi1=xi11x_{i-1}=x_{i-1}-1,然后后续的x[i,n]:=9x_{[i,n]}:=9.(这里是xi1=xi11x_{i-1}=x_{i-1}-1,而不是一直减到xi1=xix_{i-1}=x_{i},比如423这个数字,应该是399,而不是299. 这里不是xi:=9x_i:=9,而是后续所有位都变成99.)
  2. 依次从个位到最高位,按照步骤1调整。
  3. 如果是升序,就跳过。
class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        n_bit_list = []
        while n:
            n_bit_list.append(n % 10)
            n = n // 10
        n_bit_list.reverse()
        flag = len(n_bit_list)
        for idx in range(len(n_bit_list) - 1, 0, -1):
            if n_bit_list[idx - 1] > n_bit_list[idx]:
                n_bit_list[idx - 1] -= 1
                flag = idx
        for idx in range(flag, len(n_bit_list)):
            n_bit_list[idx] = 9
        res_int = 0
        for idx in range(len(n_bit_list)):
            res_int *= 10
            res_int += n_bit_list[idx]
        return res_int

1. doc reading

代码随想录 (programmercarl.com)

每个节点可能有几种状态:

有如下三种:

  • 该节点无覆盖
  • 本节点有摄像头
  • 本节点有覆盖

我们分别有三个数字来表示:

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

空节点的状态只能是有覆盖,这样就可以在叶子节点的父节点放摄像头了

  • 左孩子有覆盖,右孩子有覆盖,那么此时中间节点应该就是无覆盖的状态了。
  • 有一个孩子没有覆盖,父节点就应该放摄像头。
  • 左右孩子节点有一个有摄像头了,那么其父节点就应该是2(覆盖的状态)
  • 递归结束之后,还要判断根节点,如果没有覆盖,result++
# 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 __init__(self):
        self.camera_num = 0
    
    def traversal(self, root):
        if root is None:
            return 2
        else:
            left_state = self.traversal(root.right)
            right_state = self.traversal(root.left)
            if (left_state == 0) or (right_state == 0):
                self.camera_num += 1
                return 1
            if (left_state == 1) or (right_state == 1):
                return 2
            if (left_state == 2) and (right_state == 2):
                return 0

    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        if self.traversal(root) == 0:
            return self.camera_num + 1
        else:
            return self.camera_num