查找未排序数组中是否存在元素(x,y,z),以便x + y = z

时间:2018-11-08 14:58:52

标签: arrays algorithm

给出一个未排序的数组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)?

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。