这就是我提出的问题
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)。 有没有更好的方法来解决这个问题?
答案 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;