面试时被问到这个问题,不知道怎么回答。这是一个常规的 3SUM 问题,我们都知道 O(n^2) 的答案。问题是这样的:你有 3 个未排序的数组 a、b、c。找到三个元素,使得 a[i] + b[j] + c[k] = 0。在这种情况下,您不允许使用散列,并且解决方案必须 <= O(n^2)
这是我的答案,是的,不幸的是,这仍然是 O(n^3)
public static void get3Sum(int[] a, int[] b, int[] c) {
int i = 0, j = 0, k = 0, lengthOfArrayA = a.length, lengthOfArrayB = b.length, lengthOfArrayC = c.length;
for (i = 0; i < lengthOfArrayA; i++) {
j = k = 0;
while (j < lengthOfArrayB) {
if (k >= lengthOfArrayC) {
j++;
continue;
} else if (a[i] + b[j] + c[k] == 0) {
// found it: so print
System.out.println(a[i] + " " + b[j] + " " + c[k]);
k++;
if (j > lengthOfArrayB - 1)
break;
} else {
k++;
if (k >= lengthOfArrayC) {
j++;
k = 0;
}
}
}
}
}
有人有什么绝妙的想法可以在小于或等于 O(N^2) 的时间内解决这个问题吗?
谢谢!