题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干,每个孩子都有一个饥饿度,且只有饼干的大小大于或等于孩子的饥饿度时,孩子才能感到满足。求解最多能满足多少个孩子。
LeetCode原题链接:
455.分发饼干
输入输出样例
输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多可以满足多少个孩子的数量。
Input: [1,2,3], [1,1]
Output: 1
Explain:
虽然拥有两块大小为1的饼干,但只能让唯一的饥饿度为1的孩子满足,所以输出为1.
思路
这道题我们可以使用贪心法解决,考虑最贪的策略,每个孩子只给大小恰好令其满足的饼干,绝不多给,即令饼干大小尽可能等于饥饿度。首先我们要先获取大小关系,将孩子的饥饿度与饼干大小分别排序,这样就可以从饥饿度最小的孩子和最小的饼干出发,逐一进行比较:能满足则令结果+1,不能满足再用大一点的饼干进行比较,从而得出满足条件的“对子”的数目。
代码实现
//c++实现
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end()); //孩子饥饿度的排序
sort(s.begin(),s.end()); //饼干大小的排序
int i=0,j=0; //i为能满足的孩子数及孩子数组的索引,j为饼干数组的索引
while(i<g.size() && j<s.size()){
if(g[i]<=s[j]){
++i; //饼干大小能够满足孩子的饥饿度
}
++j;
}
return i;
}
};
这里附上JAVA的代码:(其实差别不是很大)
//JAVA实现
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i = 0, j = 0;
while(i < g.length && j < s.length){
if(g[i] <= s[j]){
++i;
}
++j;
}
return i;
}
}
总结
本题属于贪心策略中比较简单的一题,也是明显的分配问题,值得注意的是,对数组或字符串进行排序可以方便我们进行大小的比较。