455 分配cookies

小白渣翻译:

假设你是一位很棒的父母,想给你的孩子一些饼干。但是,你最多应该给每个孩子一块饼干。

每个孩子 i 都有一个贪婪因子 g[i] ,这是孩子满意的 cookie 的最小大小;每个 cookie j 都有一个大小 s[j] 。如果 s[j] >= g[i] ,我们可以将 cookie j 分配给孩子子 i 。你的目标是最大化内容子项的数量并输出最大数量。

例子

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】-LMLPHP

这里是小白理解

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】-LMLPHP
思考1:这题目描述很诡异,另外就是限制也会诡异,导致我们感觉就是一道简单的array题目,但是乍一看,确实不太懂他的意思。

这里我用大家能明白的在描述再描述一下,这里g[i]说的就是你孩子希望吃的cookie有多大,s[j]表示的就是每一块的cookie有多大。

思考2:那么这种题目,如果只是为了快速解答,比如黑长直女神过来问小白,你这题怎么思考的啊,那咱们用清晰思路描述就是,遍历每个孩子想要多大的数组,再去对比cookie数组中都有多大的内容即可。

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】-LMLPHP
黑长直OS:小伙子,可以啊,这不仅逻辑感人,阅读理解也有俩下子!

真正面试环节

面试官:你可以解答这道”分配饼干“的题目吗,来满足这些熊孩子

小白:嘿嘿,这不巧了么这不是

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】-LMLPHP

public int findContentChildren(int[] g, int[] s) {
        // 初始化满足要求的孩子数量
        int count = 0;

        // 遍历 cookie 数组
        for (int i = 0; i < s.length; i++) {
            // 尝试将当前饼干分配给 g 数组中的每个孩子
            for (int j = 0; j < g.length; j++) {
                // 如果分配成功,那么满足要求的孩子数量加 1
                if (g[j] <= s[i]) {
                    count++;
                    break;
                }
            }
        }
        return count;
    }

小明:OK,完事儿,等着面试官来表扬自己吧。他肯定会说:小子,你是个好手!工位都给你准备好了,工资你说了算。

面试官:嗯,你这个要是g 和 s 给了 3 ∗ 1 0 4 3 * 10^4 3104个数是不是会影响性能?​​

小明OS:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。不是,这谁能生 3 ∗ 1 0 4 3 * 10^4 3104个孩子去!

好吧,逼我拿出压箱底的东西是吧。的确这个算法是偏慢,既然是贪心的熊孩子,那就试试用贪心算法试试

public int findContentChildren(int[] g, int[] s) {
        // 对 g 和 s 进行排序
        Arrays.sort(g);
        Arrays.sort(s);

        // 初始化满足要求的孩子数量
        int count = 0;

        // 遍历 贪婪孩子数组 和 cookie数组
        for (int i = 0, j = 0; i < g.length && j < s.length; i++) {
        
            // 如果当前孩子的贪心值小于当前饼干的大小,那么满足该孩子的要求
            if (g[i] <= s[j]) {
                count++;
                j++;
            }
        }
        return count;
    }
  • 首先,我们将 g 数组和 s 数组进行排序,贪心值最小的在前,饼干大小最小的在前。
  • 然后,我们从 g 数组的头部开始遍历,从 s 数组的头部开始遍历。
  • 如果当前孩子的贪心值小于当前饼干的大小,那么我们满足该孩子的要求,并将该孩子从 g 数组中删除。
  • 否则,我们无法满足该孩子的要求。
  • 重复步骤 3 和步骤 4,直到 g 数组为空。

好了,时间复杂度O(n)了,下一面继续
小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】-LMLPHP
编码道路漫漫,只要先看脚下的路,徐徐前进即可。

01-30 14:30