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

455 分配cookies

小白渣翻译:

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

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

例子

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】_第1张图片

这里是小白理解

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

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

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

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

真正面试环节

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

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

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】_第4张图片

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) {
		// 数组s的长度即cookies的数量
        int cookiesNums = s.length;
        // cookies为零,返回0
        if(cookiesNums == 0)  return 0;
        // 对 g 与 s 数组进行排序
        Arrays.sort(g);
        Arrays.sort(s);

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

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

你可能感兴趣的:(leetcode,面试,leetcode,java)