【力扣-贪心】分发饼干

101 阅读3分钟

「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战」。

分发饼干

题目描述

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

算法描述

这道题目实质上就是贪心算法的实现,在解题之前我们先来看一看贪心算法的一些相关概念吧!
贪心算法的定义
顾名思义,贪心算法总是做出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
回到本题中,对于每个孩子来说都有一个胃口值,每块饼干都有一个尺寸值。
本题中提出的要求是将饼干分配给孩子尽可能满足越多数量的孩子,当然这个饼干的尺寸值一定要符合胃口值,这就相当于尺寸值必须不能小于胃口值。
我们利用贪心算法来解决这道题,首先将胃口值数组和饼干尺寸数组排序,然后从胃口值出发,我们优先考虑胃口值,先喂饱大胃口的,即从后向前遍历,然后按照胃口值从大到小依次分发饼干,统计孩子的数量。

代码描述

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //将胃口值数组和饼干尺寸数组排序
        Arrays.sort(g);
        Arrays.sort(s);  
        //定义饼干尺寸数组下标,从最右边开始,即数组中的最大值
        int start=s.length-1;
        //定义孩子的数量,初始值为0
        int count=0;
        //将胃口值从后往前遍历
        for(int i=g.length-1;i>=0;i--){
            //当胃口值不小于饼干的尺寸值时,说明符合分发条件,开始分发,孩子的数量加1
            //然后继续向左遍历,进行同样的判断和操作,直到循环结束。
            if(start>=0&&g[i]<=s[start]){
                start--;
                count++;
            }
        }
        //统计孩子的数量
        return count;
    }
}