先日、Amazon のインタビューを受けましたが、次の問題に関する質問がありました。
任意の数の正と負の要素を含む 2 つの整数配列が与えられた場合、両方の配列に含まれる数値を見つけます。
この問題は非常に簡単に解決できたHashMaps
ので、O(n)
計算が複雑になりますが、残念ながらこれにはO(n)
スペースの複雑さも伴います。これは、各配列のすべての要素を反復処理することにより、追加のメモリなしで実行できますが、O(n^2)
.
メソッドの説明が終わった後、インタビュアーは、HashMap
計算上は O(n) であるが余分なメモリを使用しないメソッドを考えられるかどうか尋ねました。その場で何も考えられず、これに対する解決策を見つけることができませんでした。線形時間で余分なメモリを使用せずにこれらの値を見つける方法はありますか?
注: この質問を CareerCup に投稿しましたが、そこにいる全員が、余分なスペースを使用しないために必要であり、O(n)
計算上でなければならないという概念を理解していないようです。
インタビュー中に使用したコードは次のとおりです。それは機能しますが、スペースの場合は O(1) ではありません。
import java.util.*;
public class ArrayFun {
public static void main(String[] args) {
int[] a = {1,2,3,4};
int[] b = {2,5,6,7,3,2,2,2,2,1,2,2,2,2};
ArrayList<Integer> matches = ArrayFun.findMatches(a,b);
for (int i = 0;i<matches.size();++i) {
System.out.println(matches.get(i));
}
}
public static ArrayList<Integer> findMatches(int[] a, int[] b) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
ArrayList<Integer> matches = new ArrayList<Integer>();
for (int i = 0;i<a.length;++i) {
map.put(a[i],0);
}
for (int i = 0;i<b.length;++i) {
if (map.get(b[i]) != null && map.get(b[i]) == 0) {
map.put(b[i],1);
matches.add(b[i]);
}
}
return matches;
}
}
このコードは戻ります
1,2,3
編集: また、追加のスペースがなく、O(1) と言うときは、それらを同じ意味で使用しています。追加のスペースがないということは、小さなプレースホルダー変数は問題ありませんが、新しい配列を割り当てることはできないということです。