给定4个数组,找到具有零和的四倍数

时间:2012-03-19 16:54:09

标签: algorithm data-structures puzzle

  • 给出4个可包含正数和负数的数组。
  • 找到每个阵列中带有一个数字的所有可能的集合(即每个集合将包含4个数字),使得4个数字的总和为零。

5 个答案:

答案 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)运行时