给出一个未排序的数组A [1 ... n]。编写一个算法,如果A中存在三个元素A [i],A [j],A [k],则返回true,这样A [i] + A [j] = A [k],否则算法必须返回false(请注意,可能是A [i] = A [j]且合法)。所需时间为O(n ^ 2)。 我想出了一种可以在O(n ^ 2 * log(n))中运行的算法。我的算法对数组进行排序,然后对每个两个元素x,y使用二进制搜索来查找是否存在元素x + y。 是否有更快的解决方案需要O(n ^ 2)?
答案 0 :(得分:3)
您可以先对数组进行排序-O(nlogn)
然后归结为在元素A[k]
的元素A[0] .. A[k-1]
中为A[k]
找到两个总和
已排序数组的两个和可以在O(n)
中通过两种指针技术找到:
boolean searchSum( int k, int[] A ) {
if ( k > A.length - 1 || k < 2 ) return false;
i = 0, j = k-1
while ( i < j ) {
if (A[i] + A[j] == A[k])
return true;
else if (A[i] + A[j] < A[k])
i++;
else
j--;
}
return false;
}
每个k为O(k-1)
,总体复杂度应为O(n^2)
。
您可以像这样致电searchSum
boolean myMethod( int[] A ) {
sort(A);
for ( int i = A.length - 1; i >= 2; i-- ) {
if ( searchSum( i, A ) ) {
return true;
}
}
return false;
}
答案 1 :(得分:1)
您可以创建具有O(1)查找的A元素的哈希表,并将其用于搜索x + y。