答案 0 :(得分:2)
循环遍历数组1并将所有元素添加到地图中。
现在从其他3个数组中找到所有组合,这些组合在地图中添加了一个从数组1中得到的数字。这非常简单。如果你需要一些伪代码,请告诉我。 O(n ^ 3)运行时
更好的解决方案是将数组2乘以2并对它们求和。您可以将它推广到n个数组(其中n是偶数)。您正在构建一个树结构,其中每个节点都是一个数组。叶子是初始给定的数组,然后是一级,你可以添加2个数组(来自叶子),依此类推。 nlogn 运行时,其中n是数组的平均大小。 (对于每个元素@position i [在数组中]你构建一个树)
修改强>
只是一张纸条(由于历史原因)
我记得我曾经有过类似的问题。我当时做的是仍然使用这个二叉树方法,但我在树的每个阶段计算组合。我拿了2个数组并将它们组合成一个大小为n ^ 2的较大数组。然后在下一阶段,新阵列的大小为n ^ 4,依此类推。当我留下2个数组时,我映射了一个。然后检查另一个数组中的元素是否在地图中。
答案 1 :(得分:2)
如果你想找到所有这些,那么就没有办法在o(n ^ 4)中进行,因为可能有很多套。
如果你想计算它们,可以通过中间相遇的技巧在O(n ^ 2 log n)和O(n ^ 2)空间中解决。
让我们调用数组A,B,C,D。我们创建两个数组X和Y。
for a in A:
for b in B:
X.append(a + b)
Y与C和D相同。您对X和Y进行排序(在O(n ^ 2 log n)中)。然后你做:
i = 0
j = size(Y) - 1
count = 0
while i < size(X) and j >= 0:
if X[i] + Y[j] == 0:
ii = 1
jj = 1
while X[i] == X[i + 1]:
ii++
i++
while Y[j] == Y[j - 1]:
jj++
j--
count += ii * jj
if X[i] + Y[j] > 0: j--
if X[i] + Y[j] < 0: i++
Output count
答案 2 :(得分:1)
蛮力方法:注意我没有测试过这个
public void setsOfZero(int[] one,int[] two,int[] three,int[] four)
{
List<IntegerSet> setsOfIntegers = new ArrayList<IntegerSet>();
for(int i =0;i < one.length ; i++)
{
for(int k = 0; k < two.length; k++)
{
for(int j = 0; j<three.length; j++)
{
for(int l = 0;l< four.length; l++)
{
if((one[i]+ two[k] + three[j] + four[l])==0)
{
IntegerSet intSet = new IntegerSet();
intSet.one = one[i];
intSet.two = two[k];
intSet.three = three[j];
intSet.four = four[l];
setsOfIntegers.add(intSet);
}
}
}
}
}
}
IntegerSet类
public class IntegerSet{
public int one =0;
public int two =0;
public int three =0;
public int four =0;
}
答案 3 :(得分:1)
取前两个数组(A,B)并使用成对总和创建一个新数组(E)。对成对和数组(E)进行排序。对于剩下的两个数组(C,D)中的每对数字,检查它们的对称是否存在于成对和数组(E)中。
复杂性:O(n ^ 2 log(n))
答案 4 :(得分:1)
阿德里安的想法还不够: - )
循环遍历数组1和2,并将所有总和添加到地图中。
现在,从其他2个数组中找到所有组合,这些组合在地图中添加了数组1和2中的数字。它非常简单。如果您需要一些伪代码,请告诉我。
O(n ^ 2)运行时