题目(leecode T455):
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i
,都有一个胃口值 g[i]
,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j
,都有一个尺寸 s[j]
。如果 s[j] >= g[i]
,我们可以将这个饼干 j
分配给孩子 i
,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
方法:从本题开始进入了贪心算法的部分,本题是贪心算法的入门级题目。贪心最重要的思想是局部最优解是否能推出整体最优解的问题,如果可以的话就毫无犹豫的使用贪心算法。本题中我们将孩子的胃口与饼干的大小排序,最大的饼干可以蛮大胃口大的孩子,也可以满足胃口小的孩子,但为了让能够满足的孩子的数量最多,我们将它分给了胃口大的孩子。因此我们可以遍历胃口数组,从后往前,每次将目前最大的饼干尝试分配给目前胃口最大的孩子,如果能够满足我们就分配,如果不能满足,我们就往胃口较小的孩子的方向遍历,再尝试分配。直到遍历到了最后一个孩子,这样我们在过程中每次都是将最大的饼干分配给能满足的胃口最大的孩子,因此这就是每一步的局部最优解,最后结束时我们获得的就是全局的最优解。
题解:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int result = 0;
int index = s.size() - 1; //饼干数组的索引,从大往小
for(int i = g.size() - 1; i >= 0; i--){ //遍历胃口数组,从大往小
if(index >= 0 && s[index] >= g[i]){ //饼干满足胃口
index--;
result++;
}
}
return result;
}
};