455 分配cookies
小白渣翻译:
假设你是一位很棒的父母,想给你的孩子一些饼干。但是,你最多应该给每个孩子一块饼干。
每个孩子 i 都有一个贪婪因子 g[i] ,这是孩子满意的 cookie 的最小大小;每个 cookie j 都有一个大小 s[j] 。如果 s[j] >= g[i] ,我们可以将 cookie j 分配给孩子子 i 。你的目标是最大化内容子项的数量并输出最大数量。
例子
这里是小白理解
思考1:这题目描述很诡异,另外就是限制也会诡异,导致我们感觉就是一道简单的array题目,但是乍一看,确实不太懂他的意思。
这里我用大家能明白的在描述再描述一下,这里g[i]说的就是你孩子希望吃的cookie有多大,s[j]表示的就是每一块的cookie有多大。
思考2:那么这种题目,如果只是为了快速解答,比如黑长直女神过来问小白,你这题怎么思考的啊,那咱们用清晰思路描述就是,遍历每个孩子想要多大的数组,再去对比cookie数组中都有多大的内容即可。
黑长直OS:小伙子,可以啊,这不仅逻辑感人,阅读理解也有俩下子!
真正面试环节
面试官:你可以解答这道”分配饼干“的题目吗,来满足这些熊孩子
小白:嘿嘿,这不巧了么这不是
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 3∗104个数是不是会影响性能?
小明OS:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。不是,这谁能生 3 ∗ 1 0 4 3 * 10^4 3∗104个孩子去!
好吧,逼我拿出压箱底的东西是吧。的确这个算法是偏慢,既然是贪心的熊孩子,那就试试用贪心算法试试
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)了,下一面继续
编码道路漫漫,只要先看脚下的路,徐徐前进即可。