1.题目连接:
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 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.
提示:
◦ |
| |
◦ |
| |
◦ | 1 <= g[i], s[j] <= 2(31) - 1 |
3. 解法(贪心):
(既然是很棒的家长,为什么不多买一些饼干呢(#狗头))贪心策略:
先将两个数组排序。
针对胃口较小的孩子,从小到大挑选饼干:
i. 如果当前饼干能满足,直接喂(最小的饼干都能满足,不要浪费大饼干);
ii. 如果当前饼干不能满足,放弃这个饼干,去检测下一个饼干(这个饼干连最小胃口的孩子都 无法满足,更别提那些胃口大的孩子了)。
Java算法代码:
class Solution {
public int findContentChildren(int[] g, int[] s) {
//先排序
Arrays.sort(g);
Arrays.sort(s);
//利用双指针找答案
int ret = 0, m = g.length, n = s.length;
for(int i = 0, j = 0; i < m && j < n; i++, j++){
while(j < n && s[j] < g[i]) j++; // 找饼干
if(j < n) ret++;
}
return ret;
}
}
运行结果:
贪心策略:
贪心策略的体现
- 优先用最小的饼干(s[0] = 1)满足最小的孩子(g[0] = 1)。
- 用稍大的饼干(s[1] = 2)满足下一个孩子(g[1] = 2)。
- 这样确保了饼干的高效利用,最大化满足的孩子数量。