Google 面试题:分饼干

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)均从小到大排序,分别用指针ij来指示孩子和饼干。
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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值