Question
假设有一群孩子和一些饼干,每一块饼干j
的大小为s(j)
,同时每一个孩子i
被分到的饼干大小至少为g(i)
,即s(j)>=g(i)
时这个孩子才会满足,g(i)
称为孩子i
的满足度。我们的目标是将饼干分配给孩子,使得到满足的孩子尽可能多。保证每个g(i)
为正,且不能将多块饼干分给一个孩子或将一块饼干分给多个孩子。
example1:
输入: [1,2,3], [1,1]
输出: 1
说明: 三个孩子的满足度分别为1,2,3,两块饼干的大小均为1。饼干的大小为1,只能满足第一个孩子,所以输出1。
example2:
输入: [1,2], [1,2,3]
输出: 2
说明: 两个孩子的满足度分别为1,2,三块饼干的大小分别为1,2,3。这三块饼干的大小足以满足这两个孩子,所以输出2。
Answer
Solution 1:
使用贪心的思想。
- 为了使得满足的孩子尽可能的多,所以我们在分饼干的时候,要使得在满足其满意度的情况下,每个孩子分得的饼干尽可能的小;
- 从小到大排序孩子们的满意度
g(i)
,对单个孩子i
,从剩余的饼干中寻找最小的能够满足该孩子的饼干; - 将数组
s(j)
和g(i)
均从小到大排序,分别用指针i
和j
来指示孩子和饼干。
class Solution {
public int findContentChildren(int[] g, int[] s){
Arrays.sort(g);
Arrays.sort(s);
int i, j;
for (i = j = 0; i < g.length && j < s.length; j++){
if (g[i] <= s[j]){
i++;
}
}
return i;
}
}
- 时间复杂度:O(nlgn),这里排序的时间复杂度是O(nlgn),遍历的时间复杂度是O(n),和为O(nlgn)
- 空间复杂度:O(1)