当前位置:   article > 正文

代码随想录学习Day 32

代码随想录学习Day 32

738.单调递增的数字

题目链接

讲解链接

暴力解法:

  1. class Solution:
  2. def check(self, n): # 判断是否各位单调递增
  3. max = 10
  4. while n:
  5. x = n % 10
  6. if max >= x:
  7. max = x
  8. else:
  9. return False
  10. n = n // 10
  11. return True
  12. def monotoneIncreasingDigits(self, n: int) -> int:
  13. for i in range(n, 0, -1):
  14. if not self.check(i):
  15. i -= 1
  16. else:
  17. return i

贪心法:题目要求小于等于N的最大单调递增的整数。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。所以可以将N转为字符串形式,从后向前遍历,若某两位非单调递增,则将前一位-1,后一位置为9即可。

  1. class Solution:
  2. def monotoneIncreasingDigits(self, n: int) -> int:
  3. nums = str(n) # 将数字转为字符串形式
  4. flag = len(nums) # 标记为,表示该位置之后的数字都应该替换为“9”
  5. for i in range(len(nums) - 1, 0, -1): # 倒序遍历字符串
  6. if nums[i] < nums[i - 1]: # 如果非单调递增
  7. flag = i # 更新标记位
  8. nums = nums[:i - 1] + str(int(nums[i - 1]) - 1) + nums[i:] # 将i-1位置的值-1
  9. for i in range(flag, len(nums)): # 将flag后面的数字都置为‘9’
  10. nums = nums[:i] + '9' + nums[i + 1:]
  11. return int(nums)

968.监控二叉树

题目链接

讲解链接

把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。因为头结点放不放摄像头也就省下一个摄像头, 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。

局部最优:让叶子节点的父节点安摄像头,所用摄像头最少。

整体最优:全部摄像头数量所用最少。

从低到上,先给叶子节点的父节点放摄像头,然后隔两个节点放一个摄像头,直到二叉树头结点。

  1. class Solution:
  2. # Greedy Algo:
  3. # 从下往上安装摄像头:跳过leaves这样安装数量最少,局部最优 -> 全局最优
  4. # 先给leaves的父节点安装,然后每隔两层节点安装一个摄像头,直到Head
  5. # 0: 该节点未覆盖
  6. # 1: 该节点有摄像头
  7. # 2: 该节点有覆盖
  8. def minCameraCover(self, root: TreeNode) -> int:
  9. # 定义递归函数
  10. result = [0] # 用于记录摄像头的安装数量
  11. if self.traversal(root, result) == 0:
  12. result[0] += 1
  13. return result[0]
  14. def traversal(self, cur: TreeNode, result: List[int]) -> int:
  15. if not cur:
  16. return 2
  17. left = self.traversal(cur.left, result)
  18. right = self.traversal(cur.right, result)
  19. # 情况1: 左右节点都有覆盖
  20. if left == 2 and right == 2:
  21. return 0
  22. # 情况2:
  23. # left == 0 && right == 0 左右节点无覆盖
  24. # left == 1 && right == 0 左节点有摄像头,右节点无覆盖
  25. # left == 0 && right == 1 左节点无覆盖,右节点有摄像头
  26. # left == 0 && right == 2 左节点无覆盖,右节点覆盖
  27. # left == 2 && right == 0 左节点覆盖,右节点无覆盖
  28. if left == 0 or right == 0:
  29. result[0] += 1
  30. return 1
  31. # 情况3:
  32. # left == 1 && right == 2 左节点有摄像头,右节点有覆盖
  33. # left == 2 && right == 1 左节点有覆盖,右节点有摄像头
  34. # left == 1 && right == 1 左右节点都有摄像头
  35. if left == 1 or right == 1:
  36. return 2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/555902
推荐阅读
相关标签
  

闽ICP备14008679号