我正在尝试找到一种优化算法的方法,使其运行时间为O(n²)(大O符号)。
输入是一个由n个元素组成的数组,只包含正数和负数。我们可以假设数组已经排序好了。
我需要确定:对于每个r(数组的元素),是否存在s和t(也是数组的元素),使得r = s + t,并且s和t可以相同(s == t),也可以都为零。
我试图通过检查当前数字是正数还是负数来减少我必须检查的元素数量,但运行时间仍然太长。问题在于我使用了3个while循环,这已经意味着最坏情况下的运行时间为O(n³)。
以下是我的代码:
输入是一个由n个元素组成的数组,只包含正数和负数。我们可以假设数组已经排序好了。
我需要确定:对于每个r(数组的元素),是否存在s和t(也是数组的元素),使得r = s + t,并且s和t可以相同(s == t),也可以都为零。
我试图通过检查当前数字是正数还是负数来减少我必须检查的元素数量,但运行时间仍然太长。问题在于我使用了3个while循环,这已经意味着最坏情况下的运行时间为O(n³)。
以下是我的代码:
public static void Checker(int[] array) {
List<Integer> testlist = new ArrayList<Integer>();
int i = 0;
while (i < array.length) {
int current = array[i];
if (attached(current, array)) {
testlist.add(current);
}
i++;
}
}
public static boolean attached(int current, int[] array) {
boolean result = false;
int i = 0;
while (i < array.length && !result) {
int number1 = array[i];
int j = 0;
while (j < array.length && !result) {
int number2 = array[j];
if (number1 + number2 == current) {
result = true;
}
j++;
}
i++;
}
return result;
}