检查整数数组是否包含整数a [i],使得a [i] = a [j] + a [k]其中j,k <i和=“”j!=“k”

时间:2017-03-11 20:54:59

标签: arrays algorithm

=“”

这就是我提出的问题

public static boolean pairEqualSum(int[] a) {
        for (int i = 2; i < a.length; i++) {
            for (int j = i - 1; j >= 1; j--) {
                for (int k = j - 1; k >= 0; k--) {
                    if (a[i] == a[j] + a[k]) {
                        System.out.println(i + " " + j + " " + k);
                        return true;
                    }
                }
            }

        }
        return false;
    }

我只能通过三个循环解决这个问题,这使得它的时间复杂度为O(n ^ 3)。 有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

首先我们可以解决另一个任务:给定一个项目数组,回答是否可以从两个元素的总和中创建一个数字X

为了做到这一点,我们可以对数组进行排序并引入左右位置。

L                 R  
1 3 8 13 15 19 44 178

现在我们可以执行两项操作:

  • L移至右侧
  • 以增加总和
  • R向左移动
  • 减少总和

使用这两项操作,我们可以在O(n)中回答问题,始终保持L+R尽可能接近X。由于排序,这种方法导致整体算法复杂度为O(n*lg(n))

使用此算法,您可以实现O(n*n)的最终复杂性(考虑到您只使用所有项目排序数组一次,然后只需&#34;启用&#34;数组元素移动X)。

答案 1 :(得分:0)

这样怎么样?

int[] arr[];
hashtable = init_hashtable();

for(int i = 2; i < arr.length; i++)
{
    if (hastable.Contains(arr[i])) return true;

    //we need combinations from orange vertical column
    for(int j = 0; j < arr.length - 1; j++)
    {
         int combination = arr[j] + arr[i-1];
         if (arr[i] == combination || !hashtable.Set(combination))
            return true;
    }
}
return false;

Previous elements combinations j,k < i, j != k, a_j + a_k = a_i

  • 黄色是数组中的主要迭代,
  • 绿色j,k组合,
  • 黑色是镜子组合,
  • 红色是j = k,
  • 在每次迭代中,我们需要从橙色垂直列插入新组合