贪心算法:分饼干

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

分发饼干

对待 先用大的喂饱大胃口:先遍历胃口,再遍历饼干。

固定最大的饼干不浪费,如果这个胃口满足不了,就换下一个小点的胃口。

  • 代码逻辑(先胃口,后饼干):

    cpp

    复制代码
    for (int i = 0; i < g.size(); i++) { // 遍历胃口(从大到小)
        if (j < s.size() && s[j] >= g[i]) { // 如果当前最大饼干够用
            j++; // 饼干用掉,指针后移
            count++;
        }
        // 如果最大饼干不够用,这块饼干就等着看下一个较小的胃口
    }
  • 为什么这么走?

    因为最大的饼干是"王牌"。如果最大的饼干连当前最大的胃口都喂不饱,那这个最大的胃口就永远没戏了(因为其他饼干更小),直接放弃这个胃口,去看下一个稍微小一点的胃口。

    比如胃口 [10, 9],饼干 [8]。最大饼干 8 喂不饱 10,放弃 10,去看 9,发现 8 还是不够,最终一个都喂不饱。先看胃口,是为了判断"王牌饼干还有没有用"。

对待 先用小的喂饱小胃口:先遍历饼干,再遍历胃口。

  • 代码逻辑(先饼干,后胃口):

    cpp

    复制代码
    for (int i = 0; i < s.size(); i++) { // 遍历饼干(从小到大)
        if (j < g.size() && s[i] >= g[j]) { // 如果当前最小饼干能喂饱当前最小胃口
            j++; // 胃口满足了,看下一个胃口
            count++;
        }
        // 如果最小饼干连最小胃口都喂不饱,这块饼干就是废铁,直接扔掉看下一块大点的饼干
    }
  • 为什么这么走?

    因为最小的饼干是最"鸡肋"的。如果最小的饼干连当前最小的胃口都喂不饱,那它肯定也喂不饱后面更大的胃口,所以直接跳过这块饼干(浪费掉) ,看下一块大一点的饼干。

    比如胃口 [2, 3],饼干 [1, 4]。最小饼干 1 喂不饱最小胃口 2,直接扔掉 1(i++);看饼干 4,能喂饱胃口 2,成功。先看饼干,是为了判断"鸡肋饼干还能不能抢救一下"。

代码bug问题:

cpp 复制代码
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int index=0;
        int res=0;
        for(int i=0;i<=s.size()-1;i++){
            if(s[i]>=g[index]&&index<=g.size()-1){//这一行是错的,原因如下×
                index++;
                res++;
            }
        }
        
        return res;
    }
};

错误 1:循环条件 i <= s.size() - 1 在 s.size() == 0 时崩溃

当 s 为空时,s.size() 返回 0,s.size() - 1 是无符号整数下溢(变成 18446744073709551615),循环会执行几十亿次,疯狂越界访问。

修正 :使用 for (int i = 0; i < s.size(); i++),这样当 s.size() == 0 时循环体不会执行。


🚨 错误 2:访问 g[index] 之前没有检查 index 是否越界

在 if 条件中,你写的是:

cpp

复制代码
if (s[i] >= g[index] && index <= g.size() - 1)

这里 先 计算了 g[index],后 检查 index <= g.size() - 1。当 index 已经等于 g.size() 时,g[index] 直接越界,程序崩溃。

相关推荐
All for pursuit.1 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青1 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq1 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq1 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
Logic1011 小时前
C语言/数据结构贪心算法题解:字符串趋同——逐位统计最高频率求最小修改代价
c语言·数据结构·贪心算法·字符串·时间复杂度·频率统计·算法题
the3clipse2 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE2 小时前
10.4【A】
算法
Godspeed Zhao2 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)2 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro2 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理