LeetCode(#455):分发饼干

image

一、前言

本题为LeetCode第455题,是一道 贪心算法 相关的算法题,难度简单。

本题链接:#455.分发饼干

二、题目

有一群孩子和一堆饼干,每个孩子只能得到一个饼干。每个孩子 i 有一个对应的胃口值 g[i] ,每个饼干 j 有一个对应的尺寸 s[j] 。只有饼干的尺寸不小于孩子的胃口值时,这个孩子才能满足。求解最多有多少孩子可以满足。

示例1:

Input: [1,2], [1,2,3]	// 分别代表孩子胃口值和饼干尺寸
Output: 2	// 表示最多能满足2个孩子

示例二:

Input: [1,2,3], [1,1]
Output: 1

三、思路

​ 首先分析题干要求,每个孩子只能得到一块饼干,饼干尺寸不小于孩子胃口值才能使孩子满足,求解满足孩子数量的最大值。这是一道求最优解的题目,并且考虑整体最优解(同时考虑所有孩子)比较复杂,可以拆分成一个个子问题,即每次只考虑一个孩子,求出局部最优解,最终将所有的局部最优解合成整体最优解。也就是贪心策略。

​ 由于胃口值最小的孩子最容易得到满足,因此我们先考虑这个孩子。为了能够最多地满足后面胃口值更大的孩子,我们应该尽量把尺寸小但又能满足这个孩子的饼干分给他,即尺寸大于等于这个孩子胃口值且尺寸最小的饼干,这就是局部最优解。满足这个孩子后,我们根据相同的方法,考虑剩余孩子中胃口值最小的那个孩子,直到不存在满足条件的饼干为止。

四、Java代码

public class soultion {
    public int assignCookies(int[] g, int[] s) {
        // 首先将胃口值数组g和尺寸值数组s内的元素进行排序
        Arrays.sort(g);
        Arrays.sort(s);
        int n = 0;
        
        // for循环遍历饼干尺寸数组,找出符合条件的饼干
        // 也可用while循环,可自己尝试
        for(int i = 0; i < s.length; i++) {
            if( s[i] >= g[n] ) n++;
            if( n == g.length ) break;
        }
        
        return n;
    }
}
posted @ 2021-03-28 12:22  江子川  阅读(244)  评论(0)    收藏  举报