清单
● 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