给定一组正整数,找到一个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))
答案 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 }
<强>算法强>
D = { Di | Di = Li^2 }
平方所有数字
T = { Ti | Ti = Di+Dj, i!=j }
不同的2-Sums
S = { Si | Si = (Ti,Tj), i!=j, Ti=Tj }
找到相当的2-Sums
<强>分析强>
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;
}
}