贪心算法:分饼干

📅 2026/7/26 15:07:12
贪心算法:分饼干
贪心的本质是选择每一阶段的局部最优从而达到全局最优。分发饼干对待 先用大的喂饱大胃口先遍历胃口再遍历饼干。固定最大的饼干不浪费如果这个胃口满足不了就换下一个小点的胃口。代码逻辑先胃口后饼干cppfor (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还是不够最终一个都喂不饱。先看胃口是为了判断“王牌饼干还有没有用”。对待 先用小的喂饱小胃口先遍历饼干再遍历胃口。代码逻辑先饼干后胃口cppfor (int i 0; i s.size(); i) { // 遍历饼干从小到大 if (j g.size() s[i] g[j]) { // 如果当前最小饼干能喂饱当前最小胃口 j; // 胃口满足了看下一个胃口 count; } // 如果最小饼干连最小胃口都喂不饱这块饼干就是废铁直接扔掉看下一块大点的饼干 }为什么这么走因为最小的饼干是最“鸡肋”的。如果最小的饼干连当前最小的胃口都喂不饱那它肯定也喂不饱后面更大的胃口所以直接跳过这块饼干浪费掉看下一块大一点的饼干。比如胃口[2, 3]饼干[1, 4]。最小饼干1喂不饱最小胃口2直接扔掉1i看饼干4能喂饱胃口2成功。先看饼干是为了判断“鸡肋饼干还能不能抢救一下”。代码bug问题class Solution { public: int findContentChildren(vectorint g, vectorint s) { sort(g.begin(),g.end()); sort(s.begin(),s.end()); int index0; int res0; for(int i0;is.size()-1;i){ if(s[i]g[index]indexg.size()-1){//这一行是错的原因如下× index; res; } } return res; } };错误 1循环条件i s.size() - 1在s.size() 0时崩溃当s为空时s.size()返回0s.size() - 1是无符号整数下溢变成18446744073709551615循环会执行几十亿次疯狂越界访问。修正使用for (int i 0; i s.size(); i)这样当s.size() 0时循环体不会执行。 错误 2访问g[index]之前没有检查index是否越界在if条件中你写的是cppif (s[i] g[index] index g.size() - 1)这里先计算了g[index]后检查index g.size() - 1。当index已经等于g.size()时g[index]直接越界程序崩溃。