一、基本概述
本质:
贪心的本质是选择每一段的局部最优,从而达到全局最优。
难点:
唯一的难点就是如何通过局部最优,推出整体最优。
做题方法:
毫无套路可言,最好用的策略就是多举几个测试用例,看一下贪心是否合适。
大致步骤:
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
二、做题
第455题 分发饼干
一个数组表示 每个小孩对应的胃口
一个数组表示 每块饼干对应的尺寸
大部分情况下处理两个数组都会想到用两层 for 循环,但是本题中,可以只用一层 for 循环,
用 for 循环来遍历小孩对应的胃口,然后定义一个 index 变量 ,来控制饼干数组的遍历,这样可以大大的简化逻辑。
第376题 摆动序列
时间复杂度O(n),空间复杂度O(1)
这道题有点难了。。。
图示可以根据所给数组画折线图表示,折线图可以很清楚的看清整个过程的走势,
局部最优:删除单调坡度上的节点,但是单调坡度两端的节点不删,那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
局部最优推出全局最优,并举不出反例,那么试试贪心算法。
贪心其实要从直觉出发,
比如目前要增加,那么我肯定是想把它增的高高的,这样随便随便再来一个数就会有比较大的概率是符合减的条件,
同理如果要减少,那么也是尽可能的降到足够的低,这样随便再来一个数就会有比较大的概率