# LeetCode 455、分发饼干
# 一、题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干j 分配给孩子i,这个孩子会得到满足。
你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
# 二、题目解析
# 三、参考代码
# 1、Java 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 分发饼干( LeetCode 455 ):https://leetcode-cn.com/problems/assign-cookies/
class Solution {
public int findContentChildren(int[] g, int[] s) {
// 1、将孩子们的胃口值按照从小到大的顺序排列
// 优先满足胃口小的孩子
Arrays.sort(g);
// 2、将饼干按照从小到大的顺序排列
Arrays.sort(s);
// child 代表 g 的下标,即表示有多少孩子的胃口得到满足
int child = 0;
// child 代表 s 的下标,即表示目前有多少饼干被使用了
int cookie = 0;
// 遍历所有的饼干
// 遍历过后,饼干只有两种状态
// 1、要么找到了需要这个饼干的孩子
// 2、要么剩下的孩子中,胃口值最低的孩子都大于这个饼干的值,那么这个饼干没人要
while(cookie < s.length && child < g.length){
// 孩子的胃口得到了满足
if(s[cookie] >= g[child]){
// 得到满足的孩子数量加 1
child++;
}
// 查看下一个饼干能否找到需要的孩子
cookie++;
}
// 最后返回孩子数量
return child;
}
}
# **2、**C++ 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 分发饼干( LeetCode 455 ):https://leetcode-cn.com/problems/assign-cookies/
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
// 1、将孩子们的胃口值按照从小到大的顺序排列
// 优先满足胃口小的孩子
sort(g.begin(), g.end());
// 2、将饼干按照从小到大的顺序排列
sort(s.begin(), s.end());
// child 代表 g 的下标,即表示有多少孩子的胃口得到满足
int child = 0;
// child 代表 s 的下标,即表示目前有多少饼干被使用了
int cookie = 0;
// 遍历所有的饼干
// 遍历过后,饼干只有两种状态
// 1、要么找到了需要这个饼干的孩子
// 2、要么剩下的孩子中,胃口值最低的孩子都大于这个饼干的值,那么这个饼干没人要
while(cookie < s.size() && child < g.size()){
// 孩子的胃口得到了满足
if(s[cookie] >= g[child]){
// 得到满足的孩子数量加 1
child++;
}
// 查看下一个饼干能否找到需要的孩子
cookie++;
}
// 最后返回孩子数量
return child;
}
};
# 3、Python 代码
# 登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# 分发饼干( LeetCode 455 ):https:#leetcode-cn.com/problems/assign-cookies/
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
# 1、将孩子们的胃口值按照从小到大的顺序排列
# 优先满足胃口小的孩子
g.sort()
# 2、将饼干按照从小到大的顺序排列
s.sort()
# child 代表 g 的下标,即表示有多少孩子的胃口得到满足
child = 0
# child 代表 s 的下标,即表示目前有多少饼干被使用了
cookie = 0
# 遍历所有的饼干
# 遍历过后,饼干只有两种状态
# 1、要么找到了需要这个饼干的孩子
# 2、要么剩下的孩子中,胃口值最低的孩子都大于这个饼干的值,那么这个饼干没人要
while cookie < len(s) and child < len(g) :
# 孩子的胃口得到了满足
if s[cookie] >= g[child] :
# 得到满足的孩子数量加 1
child += 1
# 查看下一个饼干能否找到需要的孩子
cookie += 1
# 最后返回孩子数量
return child
# 复杂度分析
时间复杂度:O(mlogm+nlogn),其中 m 和 n 分别是数组 g 和 s 的长度。对两个数组排序的时间复杂度是 O(mlogm+nlogn),遍历数组的时间复杂度是 O(m+n)O(m+n),因此总时间复杂度是 O(mlogm+nlogn)。
空间复杂度:O(logm+logn),其中 m 和 n 分别是数组 g 和 s 的长度。空间复杂度主要是排序的额外空间开销。