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) {
// 对 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)了,下一面继续
编码道路漫漫,只要先看脚下的路,徐徐前进即可。