LeetCode刷题日记之贪心算法(一)-分发饼干

时间:2024-10-18 14:59:47

LeetCode题目链接

这道题目就是你有一个饼干数组,里面表示你有几块不同大小的饼干,然后呢有一个小孩数组,表示有几个不同胃口大小的小孩,你要分配饼干尽可能让最多的孩子得到满足,然后输出得到满足的孩子数量????????????

请添加图片描述

我们来思路梳理

  • 首先将孩子的胃口值数组 g 和饼干的尺寸数组 s 进行升序排序。从胃口最小的孩子开始,用最小尺寸的饼干去满足。这样可以最大化地利用较小的饼干,避免浪费大饼干????????????(小饼干满足小胃口)
  • 先将孩子的胃口和饼干尺寸排序。从胃口最大的孩子开始,用尽可能大的饼干去满足。这样可以保证较大的饼干不浪费在小胃口的孩子上????????????(大饼干满足大胃口)

这里我们就以第一种策略为例来分析贪心的四个子逻辑

  • 如何判断最优解

    • 最优解的目标是尽可能多地满足孩子的胃口????????????为了达到这个目标,选择一种贪心策略来匹配饼干和孩子的胃口。通过排序和逐一分配饼干,可以确保每次都能做出最优选择——满足当前最小的胃口
  • 判断局部最优选择的可行性

    • 局部最优选择是尽量用最小的饼干去满足胃口最小的孩子????????????这样我们不会浪费大尺寸的饼干,可以为更大胃口的孩子保留大尺寸的饼干
  • 更新问题状态

    • 每当分配一个饼干给孩子时,我们需要移除已分配的饼干,表示该饼干已经用过????????????移除已满足的孩子,表示该孩子已经满足胃口????????????接着处理下一个未满足的孩子和未使用的饼干
  • 重复选择

    • 不断重复上述过程,直到饼干或孩子处理完毕。每次都选择最小的饼干去匹配最小的胃口,保证每次都是局部最优解????????????

贪心算法完整代码如下

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //将胃口数组和饼干尺寸数组进行升序排序
        Arrays.sort(g);
        Arrays.sort(s);
        //初始化遍历孩子数组和饼干数组的索引
        int childIndex = 0;
        int cookieIndex = 0;

        //重复选择:当还有未处理的孩子和饼干时进行分配
        while(childIndex < g.length && cookieIndex < s.length){
            //判断局部最优选择的可行性
            if(s[cookieIndex] >= g[childIndex])childIndex++;//更新问题状态
            cookieIndex++;//更新问题状态
        }
        return childIndex;//最优解即是被满足孩子的数量
    }
}