LeetCode GreedyAlgorIhtm

余寿

关注

阅读 52

2022-06-13

贪心算法:

Assign Cookies 分配器:

题目: 有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。 每个孩子只能吃一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。

求解最多有多少孩子可以吃饱。

思考: 一个孩子只能吃一个,饼干大小 >= 饥饿度时候才可以吃饱。

Input:
饥饿度:[1,2]
饼干大小:[1,2,3]
Outpu:
2

运算结果来看是不提供饼干复用,也就是说,大小为3的饼干只会给一个小朋友食用,而并非[1,1,1]可以食用一个饼干。

排序,孩子满足自增,饼干每次都要自增. 排序后孩子饥饿度是从小到大,如果饼干不满足孩子,也意味着一定不会满足下一个孩子,所以每次饼干都要自增.


扩展思考:

**真实的业务中估计没有这种,产品和原则也不会同意资源浪费哈哈,给自己提个需求,本着秉持节约原则,如果饼干可以共食呢?**

改变游戏规则:

  1. 三个孩子的饥饿是1,1,1,大小为3的饼干可以让三个孩子吃饱。
  2. 孩子饥饿为2,3, 大小如果为4,被这个孩子吃过后还剩2,下个孩子的饥饿程度为3,那么浪费2。

浪费的饼干累加需要让后面命中的孩子也吃饱,总之不可以浪费饼干。

解题: 可以饥饿相加,比较饼干大小相加,如果总数饼干大小>饥饿则全部满足,但是这样会浪费一次累加计算. 有序sort需要加一些业务条件,原来的条件是<=,则现在区分条件 == 和 < 做临时变量差值匹配.


代码:
#include <iostream>
#include <vector>
#include <algorithm>

int findContentChildren1(std::vector<int>& children, std::vector<int>& cookies)
{
std::sort(children.begin(), children.end());
std::sort(cookies.begin(), cookies.end());
int child = 0, cookie = 0;
// 累计浪费了多少饼干大小
int food = 0;
while (child < children.size() && cookie < cookies.size())
{
do {

if (food)
{
// 浪费饼干+一个饼干,大于孩子饥饿
if (children[child] < (food + cookies[cookie]))
{
food = (food + cookies[cookie]) - children[child];
break;
}
// 浪费饼干+一个饼干,抵消一个孩子饥饿
else if (children[child] == (food + cookies[cookie]))
break;
}
// 如果饥饿和饼干大小相等,抵消
if (children[child] == cookies[cookie])
break;
// 如果饥饿小于饼干大小,求差_累加
else if (children[child] < cookies[cookie])
{
// 这里food已经有了浪费饼干积累
food += cookies[cookie] - children[child];
}
// food + 一个饼干满足不了孩子的饥饿
else
{
// 因为while出去child++,所以这里先--, 相当于孩子不变
child--;
food += cookies[cookie];
}

} while (false);
child++;
cookie++;
}
// 已经知道有几个孩子已经吃饱,需要判断food是否有存粮(饼干)
while (child < children.size())
{
//
(food > children[child]) ? (food -= children[child]) : (food = 0);
if (food == 0)
break;
child++;
}
return child;
}

int main(void)
{
std::vector<int> children = { 1,1,0,3,3,2,2 };
std::vector<int> cookies = { 0,0,0,10,1,2 };
findContentChildren1(children, cookies);
}

LeetCode Github See 2.2:​​https://github.com/changgyhub/leetcode_101/​​

精彩评论(0)

0 0 举报