738. 单调递增的数字
1. first idea
从个位开始,检查和是否是升序,
- 如果不是,那么,所以应该减少使得,然后后续的.(这里是,而不是一直减到,比如423这个数字,应该是399,而不是299. 这里不是,而是后续所有位都变成.)
- 依次从个位到最高位,按照步骤1调整。
- 如果是升序,就跳过。
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
每个节点可能有几种状态:
有如下三种:
- 该节点无覆盖
- 本节点有摄像头
- 本节点有覆盖
我们分别有三个数字来表示:
- 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