题目描述:
标签:贪心算法
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
代码:
思路分析:贪心算法的思想是指在对问题进行求解时,在每一步都选择最优的选择,从而实现结果最优。
1、尽量让饼干尺寸大的先满足胃口大的人,实现局部最优才有可能达到全局最优。
2、所以先对g和s数组进行排序,从后往前遍历,i指向s数组,j指向g数组
3、当最大饼干尺寸没办法满足最大胃口的人时,应该j--,直到找到能满足胃口的人(这里添加 j>=0的原因是因为可能最大饼干的尺寸不能满足任何人,j会出现-1情况,s[j]会报错)
4、当找到能满足胃口的人时,count++,对下一块饼干继续同样的操作
5、如果出现所有人都满足了的情况,就没必要对所有饼干进行遍历了,直接跳出循环!
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int j = g.length - 1;
for(int i = s.length - 1;i >= 0;i--){
while(j >= 0 && s[i] < g[j]){
j--;
}
if(j >= 0){
count++;
j--;
}
if(j < 0){
break;
}
}
return count;
}
}
感觉第二版写的逻辑更清晰一点:
1、对g、s数组排序,定义双指针分别指向每个数组的最后一个元素;
2、结束循环的条件是pre1和pre2其中一个小于0
3、当s>j即饼干能满足胃口时,count++,且pre1--和pre2--。否则pre1--看能不能满足下个胃口最大的人的胃口。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int pre1 = g.length - 1;
int pre2 = s.length - 1;
int count = 0;
while(pre2 >= 0 && pre1 >= 0){
if(s[pre2] >= g[pre1]){
count++;
pre1--;
pre2--;
}else{
pre1--;
}
}
return count;
}
}