习题---贪心算法之分发饼干

题目

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 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循环。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值