代码随想录算法训练营Day 37| 贪心算法 part06 | 738.单调递增的数字、968.监控二叉树
738.单调递增的数字
一、贪心
class Solution(object):
def monotoneIncreasingDigits(self, n):
"""
:type n: int
:rtype: int
"""
nums = []
if n ==0:
return 0
while n > 0:
nums.append(n % 10)
n = n // 10
nums.reverse() # 将数字反转以匹配最高位到最低位的顺序
# 从右到左检查并修改数字,以保持递增
for i in range(len(nums) - 1, 0, -1):
if nums[i] < nums[i - 1]:
nums[i - 1] -= 1
nums[i:] = [9] * len(nums[i:]) # 将后面的所有数字设置为9
# 将数字列表转换回整数
result = int(''.join(map(str, nums)))
return result
968.监控二叉树
https://programmercarl.com/0968.%E7%9B%91%E6%8E%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E6%80%BB%E7%BB%93
一、法一
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def __init__(self):
self.result = 0
def minCameraCover(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if self.traversal(root) == 0:
self.result +=1
return self.result
def traversal(self,node):
if not node:
return 2 # 空节点为有覆盖状态
left = self.traversal(node.left)
right = self.traversal(node.right)
if left ==2 and right ==2:
return 0 # 父节点为无覆盖
if left==0 or right ==0:
self.result +=1
return 1 # 父节点为camera
if left==1 or right ==1:
return 2 #父节点为有覆盖
return -1