[英]Find if there are elements (x,y,z) in unsorted array so that x + y = z
给定一个未排序的数组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)?
您可以先对数组进行排序O(nlogn)
然后归结为在元素A[0] .. A[k-1]
找到A[k]
两个和A[0] .. A[k-1]
对于任何元素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;
}
您可以创建具有O(1)查找的A元素的哈希表,并将其用于搜索x + y。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.