面接でこの質問をされたのですが、どう答えたらいいのかわかりませんでした。これは通常の 3SUM 問題で、O(n^2) の答えは誰もが知っています。質問は次のようになります: 3 つのソートされていない配列 a、b、c があります。a[i] + b[j] + c[k] = 0 となる 3 つの要素を見つけます。このシナリオではハッシュを使用できず、解は <= 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) 以下で解決する素晴らしいアイデアはありますか?
ありがとう!