贪心算法初探

zhanglei 2023年04月24日 634次浏览

1.分发饼干

对于每个孩子 i ,都有一个胃口值 g[i] ,这是能让孩子们满足胃口的饼干的最小尺寸;

每块饼干 j ,都有一个尺寸 s[j] 。如果 s[j] >= g[i] ,我们可以将这个饼干分给孩子 i,使他得到满足。

目标是最可能满足越多数量的孩子,并输出这个最大数值。

示例1:输入 g = [1,2,3],s=[1,1]

输出 解释:有3个孩子和2块饼干,3个孩子的胃口值分别是:1,2,3。虽然只有两块小饼干,由于他们尺寸都是1,因此只能让胃口是1的孩子满足。因此输出1。

示例2:输入 g = [1,2],s = [1,2,3]

输出 解释:有2个孩子和3块饼干,两个孩子的胃口值分别为1,2。拥有的饼干可以让所有的汉字满足,因此输出2。

1.1 思路如下

1.首先对孩子的胃口值和饼干尺寸均按从小到大进行排序。
2.遍历饼干尺寸数组,判断当前饼干是否满足当前孩子的胃口值。如果满足,判断下一个孩子和饼干尺寸;如果不满足,仅仅遍历饼干尺寸数组的下一个值。
3.遍历完饼干数组,算法结束,此时孩子胃口数组的下标就是已经满足孩子的数量。

1.2 代码实现

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        // 对饼干数组s进行升序排序
        sort(s.begin(), s.end());
        // 对孩子的胃口值数组g进行升序排序
        sort(g.begin(), g.end());
        
        // 初始化满足孩子数量为0
        int index = 0;

        // 遍历饼干数组
        for (int i = 0; i < s.size() && index < g.size(); i++) {
            // 当饼干尺寸大于等于孩子胃口值时
            if (s[i] >= g[index]) {
                // 满足孩子数量加1,继续尝试满足下一个孩子
                index++;
            }
        }

        // 返回满足孩子数量
        return index;
    }
};

通过贪心策略,我们总是尽可能地将尺寸适中的饼干分配给胃口较小的孩子,这样能够最大限度地满足更多的孩子。