455.分发饼干

  1. 455.分发饼干
    1. 455.1 题目
    2. 455.2 题解
      1. 排序+贪心算法
    3. 455.3 代码
    4. 455.4 运行结果

455.分发饼干


455.1 题目

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 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。

提示:

  • 1 <= g.length <= 3 * 10^4
  • 0 <= s.length <= 3 * 10^4
  • 1 <= g[i], s[j] <= 2^31 - 1

455.2 题解

排序+贪心算法

// 方法一:排序+贪心算法
// 先对胃口数组和饼干数组进行排序,然后从最小的胃口和最小的饼干开始匹配,
// 如果当前饼干能满足当前孩子,则计数器加一并且继续匹配下一个孩子和饼干;
// 如果不能满足,则移动到下一个饼干继续尝试。
static int FindContentChildren1(int[] g, int[] s)
{
    //对胃口数组和饼干数组进行排序
    Array.Sort(g);
    Array.Sort(s);

    // 初始化孩子指针和饼干指针
    int child = 0; // 孩子指针,用于指向孩子数组的当前位置
    int cookie = 0; // 饼干指针,用于指向饼干数组的当前位置

    // 循环匹配孩子和饼干
    while (child < g.Length && cookie < s.Length)
    {
        // 如果当前饼干能满足当前孩子,则孩子指针向后移动一个位置,并继续匹配下一个孩子和饼干
        if (s[cookie] >= g[child])
        {
            child++;
        }

        // 不管是否满足当前孩子,饼干指针都要向后移动一个位置,准备匹配下一个孩子
        cookie++;
    }

    // 返回满足孩子的数量,即孩子指针的值
    return child;
}

455.3 代码

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        #region 题目

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

        // 提示:
        // 1 <= g.length <= 3 * 10^4
        // 0 <= s.length <= 3 * 10^4
        // 1 <= g[i], s[j] <= 2^31 - 1

        #endregion

        #region 测试

        // 示例 1
        int[] g1 = { 1, 2, 3 };
        int[] s1 = { 1, 1 };
        int result1_1 = FindContentChildren1(g1, s1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");

        // 示例 2
        int[] g2 = { 1, 2 };
        int[] s2 = { 1, 2, 3 };
        int result2_1 = FindContentChildren1(g2, s2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");

        #endregion
    }

    #region 答案

    // 方法一:排序+贪心算法
    // 先对胃口数组和饼干数组进行排序,然后从最小的胃口和最小的饼干开始匹配,
    // 如果当前饼干能满足当前孩子,则计数器加一并且继续匹配下一个孩子和饼干;
    // 如果不能满足,则移动到下一个饼干继续尝试。
    static int FindContentChildren1(int[] g, int[] s)
    {
        //对胃口数组和饼干数组进行排序
        Array.Sort(g);
        Array.Sort(s);

        // 初始化孩子指针和饼干指针
        int child = 0; // 孩子指针,用于指向孩子数组的当前位置
        int cookie = 0; // 饼干指针,用于指向饼干数组的当前位置

        // 循环匹配孩子和饼干
        while (child < g.Length && cookie < s.Length)
        {
            // 如果当前饼干能满足当前孩子,则孩子指针向后移动一个位置,并继续匹配下一个孩子和饼干
            if (s[cookie] >= g[child])
            {
                child++;
            }

            // 不管是否满足当前孩子,饼干指针都要向后移动一个位置,准备匹配下一个孩子
            cookie++;
        }

        // 返回满足孩子的数量,即孩子指针的值
        return child;
    }

    #endregion
}

455.4 运行结果

示例1 方法1 返回长度:6,修改后数组:[a, 2, b, 2, c, 3, c]
示例2 方法1 返回长度:1,修改后数组:[a]
示例3 方法1 返回长度:4,修改后数组:[a, b, 1, 2, b, b, b, b, b, b, b, b, b]
示例1 方法2 返回长度:6,修改后数组:[a, 2, b, 2, c, 3, c]
示例2 方法2 返回长度:1,修改后数组:[a]
示例3 方法2 返回长度:4,修改后数组:[a, b, 1, 2, b, b, b, b, b, b, b, b, b]


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏