O(n²log(n))算法查找数组中的所有数字,使x²+y²=z²+u²

时间:2014-04-20 00:33:50

标签: algorithm

给定一组正整数,找到一个O(n² log(n))算法来查找数字x, y, z, u的所有不同数字组合,使其满足

  

x 2 + y 2 = z 2 + u 2

基本上,我看到你如何使用{{1}得到 x 2 + y 2 = z 2 时间

  

排序然后迭代并使用二进制搜索

但要对其他O(n² log(n))

执行相同操作

2 个答案:

答案 0 :(得分:2)

没有O(n^2logn)解决方案,原因很简单,可能有O(n ^ 4)个可能的解决方案,如果你需要找到它们,输出大小本身为O(n^4)
看看[1,1,1,1,....,1](a,b),(c,d)的每个组合都能满足要求。 Choose(n,4)可能的解决方案中有O(n^4)

但是,如果我们将输出大小表示为m,则可以在O(n^2logn+m)中完成:

map<number,list<pair>> m = new map
for each i in 1...n:
   for each j in i+1...n:
     map.add(arr[i]^2+arr[j]^2,(i,j))
for each entry number that is key in the map:
   list = map.get(number)
   print all pairs (i,j),(x,y) in the list such that i!=x,j!=u,i!=y,j!=x

map是基于树的地图。

如果你不想要代表答案&#39; (实际上代表列表中的重复元素),如[1,1,1 ...,1]示例中所示,将map<number,list<pair>>更改为map<number,set<pair>>,然后插入值而不是指数 - 你会得到它。

答案 1 :(得分:1)

输入: List L = { L1, L2, .. Ln }

<强>算法

  1. D = { Di | Di = Li^2 }平方所有数字

  2. T = { Ti | Ti = Di+Dj, i!=j }不同的2-Sums

  3. S = { Si | Si = (Ti,Tj), i!=j, Ti=Tj }找到相当的2-Sums

  4. <强>分析

    T(Step(1)) ~ n
    
    T(Step(2)) ~ (n^2 - n)
    
    T(Step(3)) ~ (n^2 - n)
    
    T = n + (n^2 - n) + (n^2 - n)
    
    T = n^2 + n^2 + n - n - n
    
    T = 2n^2 - n ~ O(n^2)
    

    <强>代码

    Solution.Java

    class Solution
    {
        public static void main (String [] args)
        {
            int [] L = { 1, 2, 3, 4, 5, 6, 2, 4, 6, 3, 3 };
    
            int [] D = new int [L.length];
    
            for (int i=0; i<L.length; i++)
                D[i] = (L[i]^2);
    
            int nbSums = D.length^2 - D.length;
            int z = 0;
    
            int [] T = new int [nbSums];
    
            for (int i=0; i<D.length; i++)
                for (int j=0; j<D.length; j++)
                    if (i != j)
                        T[z++] = D[i] + D[j];
    
            ArrayList<Pair> S = new ArrayList<Pair>();
    
            for (int i=0; i<T.length; i++)
                for (int j=0; j<T.length; j++)
                    if (i != j && T[i] == T[j])
                        S.add(new Pair(T[i], T[j]));
        }
    }
    

    Pair.java

    class Pair
    {
        public int a;
        public int b;
    
        public Pair (int a, int b)
        {
            this.first = a;
            this.second = b;
        }
    }