leetcode贪心java

贪心

贪心的本质是选择每一阶段的局部最优从而达到全局最优
例子:
例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?
指定每次拿最大的,最终结果就是拿走最大数额的钱。
每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。

最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。

贪心一般解题步骤

贪心算法一般分为如下四步:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

说白了就是常识性推导加上举反例

摆动序列

保持区间波动,只需要把单调区间上的元素移除就可以了

买卖股票

本题中理解利润拆分是关键点! 不要整块的去看,而是把整体利润拆为每天的利润。

一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。
请添加图片描述

跳跃游戏

当前位置元素如果是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值