题目
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
思路
根据题意,因为要让最多数量的小孩满足,所以可以得出:要将最大尺寸的饼干喂给胃口最大的孩子。据贪心策略,就是先将饼干数组与小孩数组进行排序,从后至前进行遍历(从前往后也可),用大尺寸饼干喂给胃口最大的小孩,最终得到喂饱的小孩数量。
代码
class Solution {
public int findContentChildren(int[] g, int[] s) {
//给数组进行排序
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int index = s.length-1;
for(int i = g.length-1; i >= 0;i--){
//胃口要小于饼干,才算满足孩子胃口
if(index >= 0 && g[i] <= s[index]){
count++;
index--;
}
}
return count;
}
}
例如有胃口数组[3,6,7,11],饼干数组[2,5,9,13],则首先对胃口进行for循环,将饼干放入for循环的if里进行判断,满足条件饼干值>胃口值时count才++,同时饼干数组的index向前移动一位(即该饼干已被吃掉),则此案例里13->11,9->7,5->3,有三个孩子喂饱了,输出count为3。
注意
为什么不将饼干作为for循环,胃口做if判断呢?
因为for循环为固定移动,而if为满足条件才移动,上述我的写法里是从后往前进行判断,如果将胃口作为for循环,假设遇到第一个判断的饼干值为5,而第一个进行判断的胃口值为8的情况,由于无法满足饼干值>胃口值,胃口值不会index–,将会一直停留,而饼干值一直往前,越来越小,仍无法满足条件,最后得出一个错误的结果。
所以如果是从大到小进行判断,需要将胃口值作为for循环,反之,从小到大时,将饼干值作为for循环。