我正在尝试解决这个leetcode挑战,但是它没有通过3次测试。我不知道自己在做什么错。这是我的代码:
public int findContentChildren(int[] greed, int[] size) {
if (size.length == 0 || greed.length == 0) return 0;
int satisfied = 0;
for (int i = 0; i < greed.length; i++) {
for (int j = 0; j < size.length; j++) {
if (greed[i] <= size[j]) {
satisfied++;
size[j] = -1;
break;
}
}
}
return satisfied;
}
“假设您是一位了不起的父母,并且想给您的孩子一些cookie。但是,您应该最多给每个孩子一个cookie。每个孩子我都有一个贪婪因子gi,这是cookie的最小大小子将满足;并且每个cookie j的大小为sj。如果sj> = gi,我们可以将cookie j分配给子i,而子i将满足。您的目标是最大程度地增加内容的数量子并输出最大数量。 注意: 您可能会假设贪婪因素始终为正。 您不能为一个孩子分配多个cookie。
示例1:
输入:[1,2,3],[1,1]
输出:1
说明:您有3个孩子和2个cookie。 3个孩子的贪婪因子是1、2、3。
即使您有2个cookie,但由于它们的大小均为1,因此您只能使贪婪系数为1的孩子满意。 您需要输出1。“
答案 0 :(得分:0)
您正在浏览Cookie和子项的顺序是它们出现的顺序,而不是排序顺序。如果您有Cookie 1、2、3和子级3、2、1,则只有在完全匹配时才匹配两个Cookie。您需要对数组进行排序或使用堆之类的数据结构,以使Cookie分布最大化。
答案 1 :(得分:0)
将两个数组排序。
Arrays.sort(greed);
Arrays.sort(size);
在上面引用的示例中,假设贪婪为[4,5],大小为[5,4]。如果不进行排序(按照您的逻辑),则只能满足一个孩子,但是如果进行排序,则可以满足两个孩子。
答案 2 :(得分:0)
我发现您的代码中缺少一些东西。
您正在尝试为孩子准备所有饼干。直到一个cookie满足孩子的要求为止。尽管cookie被标记为-1,但摊销时间很高,因为仍会再次检查-1。理想情况下,应该避免这种检查,因为cookie已经被使用。
第二,如果未对数组进行排序,则您可能与perfect cookie
不匹配。原因在此处的其他答案中也存在。
将使用cookie标记为-1
是一个聪明的举动,但这不是必需的。您的运行时间为O(nm),但可以通过将两个排序后的数组一起迭代并保持指向读取子项和最后使用的cookie的指针,来在O(n)中完成。
计算时间复杂度,不包括排序部分。
答案 3 :(得分:0)
其他答案指出。您需要先对两个数组进行排序,然后再运行for循环。为了更加清楚,我在需要更改的位置进行了更改。
import java.util.*;
class Solution {
public int findContentChildren(int[] greed, int[] size) {
int satisfied = 0;
Arrays.sort(greed);
Arrays.sort(size);
for (int i = 0; i < greed.length; i++) {
for (int j = 0; j < size.length; j++) {
if (greed[i] <= size[j]) {
satisfied++;
size[j] = 0;
//greed[i]=0;
break;
}
}
}
return satisfied;
}
}
更改是:
import java.util.*;
,然后在使用for循环之前对两个数组进行排序。
Arrays.sort(greed);
Arrays.sort(size);
此外,由于将满意值初始化为0,所以我们不需要执行边界条件返回。因此下面的检查被删除了
if (size.length == 0 || greed.length == 0) return 0;