贪心
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
例子:
例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?
指定每次拿最大的,最终结果就是拿走最大数额的钱。
每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。
最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。
贪心一般解题步骤
贪心算法一般分为如下四步:
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
说白了就是常识性推导加上举反例。
摆动序列
保持区间波动,只需要把单调区间上的元素移除就可以了
买卖股票
本题中理解利润拆分是关键点! 不要整块的去看,而是把整体利润拆为每天的利润。
一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。
跳跃游戏
当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?
其实跳几步无所谓,关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。
这个范围内,别管是怎么跳的,反正一定可以跳过来。
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
Lambda
lambda表达式: Arrays.sort(intervals, (m, n) -> m - n);
m - n: 升序; n - m: 降序;
> 0, 升序; < 0, 降序
- Arrays.sort(intervals, (m, n) -> m[0] - n[0]);
- Arrays.sort(intervals, (m, n) -> m[0] >n[0]? 1:0);
两者有区别!!!!!!
comparator
Arrays.sort(points, (o1, o2) -> Integer.compare(o1[1], o2[1])); //对的 1 0 -1