【贪心算法专题】455. 分发饼干
1、力扣链接
https://leetcode.cn/problems/assign-cookies/description/
2、题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
示例 1:
输入: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。
示例 2:
输入: g = [1,2], s = [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.
3、题目分析
对于贪心算法的题目,可从 寻求局部最优解入手,以局部最优解,得到全局最优解
本题思路:优先考虑饼干,小饼干先喂饱小胃口
1、将两数组排序
2、定义常量
记录当前剩余的第一块饼干的索引
int start = 0;
记录被满足的孩子的个数
int count = 0;
2、遍历,如果小饼干可满足小胃口,记录
4、代码实现
1、Java
class Solution {
public int findContentChildren(int[] g, int[] s) {
//对两数组都进行排序
Arrays.sort(g);
Arrays.sort(s);
int start = 0;
int count = 0;
//遍历,如果小饼干可满足小胃口,记录
for(int i=0;i<s.length && start < g.length ;i++){
if(s[i] >= g[start]){
start++;
count++;
}
}
return count;
}
}
2、C++
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index = 0;
for(int i = 0; i < s.size(); i++) { // 饼干
if(index < g.size() && g[index] <= s[i]){ // 胃口
index++;
}
}
return index;
}
};
3、python
class Solution:
def findContentChildren(self, g, s):
g.sort() # 将孩子的贪心因子排序
s.sort() # 将饼干的尺寸排序
index = 0
for i in range(len(s)): # 遍历饼干
if index < len(g) and g[index] <= s[i]: # 如果当前孩子的贪心因子小于等于当前饼干尺寸
index += 1 # 满足一个孩子,指向下一个孩子
return index # 返回满足的孩子数目
4、go
func findContentChildren(g []int, s []int) int {
sort.Ints(g)
sort.Ints(s)
index := 0
for i := 0; i < len(s); i++ {
if index < len(g) && g[index] <= s[i] {
index++
}
}
return index
}