• LeetCoded贪心算法系列——455.分发饼干


    一、题目描述:

    455. 分发饼干https://leetcode.cn/problems/assign-cookies/

    假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

    对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

    二、分析
    1.本题是一个经典的贪心算法,怎么辨别题解需要使用贪心算法呢?

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

    这么说有点抽象,来举一个例子:

    例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?

    指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。

    再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划在我主页也有专栏,大家可以看看。

    2.贪心算法的套路

    贪心算法没有固定套路,唯一难点就是如何局部最优推出全局最优

    一般情况下可以分为如下四步:

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

    但是真正做题的时候很难分出这么详细的解题步骤,可能就是因为贪心的题目往往还和其他方面的知识混在一起

    3.具体分析和代码

    为了满足更多的小孩,就不要造成饼干尺寸的浪费。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

    当然也可以换一个思路,小饼干先喂饱小胃口

    Java代码:

    1. class Solution {
    2. //优先考虑胃口,先喂饱大胃口
    3. public int findContentChildren(int[] g, int[] s) {
    4. Arrays.sort(g);
    5. Arrays.sort(s);
    6. int count = 0;
    7. int start = s.length - 1;
    8. // 遍历胃口
    9. for (int index = g.length - 1; index >= 0; index--) {
    10. if(start >= 0 && g[index] <= s[start]) {
    11. start--;
    12. count++;
    13. }
    14. }
    15. return count;
    16. }
    17. }

     

    三.总结

    这道题是贪心很好的一道入门题目,思路还是比较容易想到的。

    文中详细介绍了思考的过程,想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心。

  • 相关阅读:
    【沐风老师】怎么在3DMAX中使用MAXScript脚本动画编程?
    使用react-router-dom在新标签页打开链接,而不是本页跳转
    动态编译库 Natasha 5.0 兼容版本发布
    微信支付回调,内网穿透详细过程
    【Flink集群RPC通讯机制(三)】AkkaRpcActor设计与实现:接收RPC消息以及处理逻辑
    LVGL移植win端模拟显示流畅解决方案-使用 SquareLine 生成前端 UI 文件
    达梦日志分析工具DMLOG使用
    面试打底稿③ 专业技能的第三部分
    【Godot4.1】Godot实现闪烁效果(Godot使用定时器实现定时触发的效果)
    二分查找:如何用最省内存的方式实现快速查找功能?
  • 原文地址:https://blog.csdn.net/w20001118/article/details/125612726