算法训练营day32 | {56.合并区间, 738.单调递增的数字, 968.监控二叉树}
第八章贪心算法part05,继续练习贪心算法,找出局部最优。
56. 合并区间
- 题目链接:56. 合并区间
- 文档讲解:代码随想录
- 视频讲解:贪心算法,合并区间有细节!LeetCode:56.合并区间
- 状态:依旧是判断重叠区间,先排序,然后比较左右边界。
1.1 解题分析
▶
56. 合并区间1 | |
738. 单调递增的数字
- 题目链接:738.单调递增的数字
- 文档讲解:代码随想录
- 视频讲解:贪心算法,思路不难想,但代码不好写!LeetCode:738.单调自增的数字
- 状态:例如n=32,因为30+不可能是单调递增的,十位数字必须减1,接着个位数字要尽可能的大。
2.1 解题分析
本题的贪心,贪在哪里比较好想,但是有两个细节问题需要注意:
- 考虑遍历顺序,只有从后向前遍历才能重复利用上次比较结果。
- 要使用一个flag变量记录最近的需要变为9的位置,并且为了达到最大,其后所有位置都要变成9.
▶
738. 单调递增的数字1 | |
968. 监控二叉树
- 题目链接:968.监控二叉树
- 文档讲解:代码随想录
- 视频讲解:贪心算法,二叉树与贪心的结合,有点难…… LeetCode:968.监督二叉树
- 状态:每个监控摄像头要尽可能地覆盖更大的范围。
3.1 解题分析
摄像头可以覆盖上中下三层,放在叶子节点就浪费了一层的覆盖范围,同时叶子节点是指数级别的多,能节省的更多。因此从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少。局部最优推出全局最优,且找不出反例,那么按照贪心来。
确定了后序遍历的都遍历顺序后,本题的难点还在于实现如何隔两个节点放一个摄像头?
- 此时需要状态转移的公式,注意就是单纯的状态转移!每个节点可能有如下三个状态,分别用三个数字来表示:
- 0:本节点无覆盖
- 1:本节点有摄像头
- 2:本节点有覆盖
- 空节点是什么状态?遍历树都过程中,遇到空节点,应该返回有覆盖状态。
▶
968. 监控二叉树1 | |
4. 贪心总结
- 究竟什么题目是贪心呢?如果找出局部最优并且可以推出全局最优,就是贪心,如果局部最优都没找出来,就不是贪心,可能是单纯的模拟。不过最终会解题就行了。
- 18道贪心题目罗列&总结
算法训练营day32 | {56.合并区间, 738.单调递增的数字, 968.监控二叉树}
http://paopaotangzu.xyz/cn/day32_leetcode/