代码随想录-贪心算法

代码随想录-贪心算法

贪心算法的本质就是选择每一阶段的局部最优,从而达到全局最优。

贪心简单题

  1. leetcode 455 分发饼干:大饼干要喂给大的,充分利用饼干尺寸。解题思路就是分别给小孩胃口和饼干尺寸排下序,然后从后往前遍历小孩胃口,进行结果的统计。
  2. leetcode 1005 K次取反后最大化的数组和:贪心想法就是每次取反后数组和都要最大,一共持续这样的操作K次。要想每次取反后数组和都要最大,那么就每次选取值最小的数取反。(如果值最小的数是正数,对它进行取反后,数组和是最大的;如果值最小的数是负数,对它进行取反后,数组和也是最大的。)
  3. leetcode 860 柠檬水找零:贪心思想就是优先找零大额的钱。维护5元、10元和20元的数量。如果是5元,就直接收下;如果是10元,就收下10元,找零5元;如果是20元,就优先找零10元和5元,没有的话就找零3个5元。

贪心中等题

  1. leetcode 376 摆动序列:求序列的最长摆动序列长度。贪心思想就是遍历每个数字并对这个数字进行处理,使这个数字及之前的序列是摆动序列。定义一个flag变量,这个变量用来表示上一段是上坡还是下坡。如果nums[i] > nums[i-1]并且上一段是下坡的话,结果加1;如果nums[i] < nums[i -1]并且上一段是上坡的话,结果加1。最后得到最终结果。
  2. leetcode 738 单调递增的数字:一旦出现第1个数字大于第2个数字,比如98,那么需要把它变为89。从后往前遍历,进行比较。记录下最后一个调整为9的位置下标,然后从这个下标往后的数值都变为9。

贪心解决股票问题

  1. leetcode 122 买卖股票的最佳时机II:可以多次交易,求最大利润。贪心算法的思想就是只要紧挨的两天有正利润,就进行股票的买入和卖出。

贪心之两个维度权衡问题

  1. leetcode 135 分发糖果:需要考虑两个孩子的两边。要遍历两遍,从左到右遍历比较1次,再从右到左遍历比较1次。
  2. leetcode 406 根据身高重建队列:本题有两个维度,身高和前面有多少人的身高高于这个人。要先确定一个维度,再进行插入。按照身高从高到低对所有人进行排序。然后从高的人开始进行插入。

贪心解决区间问题

  1. leetcode 55 跳跃游戏:这个问题可以转化为跳跃范围能不能覆盖到终点。贪心算法的思想就是每次都取最大的覆盖范围。
  2. leetcode 45 跳跃游戏II:这道题贪心的思想就是以最少的步数增加覆盖范围。记录当前步的最大覆盖范围和下一步的最大覆盖范围,如果下标达到了当前步的最大覆盖范围,则步数++。以这样的方式得到最少步数。
  3. leetcode 452 用最少数量的箭引爆气球:按照每个区间的起始位置给区间进行排序,然后遍历每个区间,如果这个区间的起始位置大于设定的界限,箭的数量加1;不是的话,就更新界限的值。
  4. leetcode 435 无重叠区间:题目要求移除区间的最小数量,使剩余区间互不重叠。可以求不重叠区间的最大数量,然后用区间总数减去求得的这个数量。按照每个区间的末尾位置给区间排序,然后遍历区间进行结果的计数。
  5. leetcode 763 划分字母区间:对字符串进行遍历,遍历到每个字符的时候,去寻找这个字符最后一次出现的位置,并更新划分的位置。如果当前遍历的下标等于划分的位置,就记录区间长度。
  6. leetcode 56 合并区间:和leetcode 452 用最少数量的箭引爆气球做法类似。不一样的地方就是这个题需要记录区间。对于结果是变长的二维数组,Java可以采用List<int[]> res来定义结果。返回结果的时候就return res.toArray(new int[res.size()][])。

贪心之其他难题

  1. leetcode 53 最大子序和:这道题的贪心思想是当连续和为负数,就立马舍弃,从一个数开始计数。
  2. leetcode 134 加油站:先计算每个加油站的剩余油量,i从0开始累加剩余油量,剩余油量和记为curSum。如果curSum < 0,那么起始位置从i+1开始算起。
  3. leetcode 968 监控二叉树:这道题的贪心思想就是使一个摄像头尽可能多的监控节点。需要从两个孩子节点的状态判断这个节点的状态,所以采用后序遍历。0代表无覆盖状态,1代表有摄像头状态,2代表有覆盖状态。那么什么时候返回哪个状态值呢?要返回0,则左右孩子节点都要是有覆盖状态;要返回1,则左右孩子至少有1个没覆盖;要返回2,则左后孩子至少有1个处于有摄像头状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值