今日のインタビューでアルゴリズムの質問がありましたが、SOメンバーの意見を取り入れたいと思います。質問は次のとおりです。
整数が昇順で等しいサイズのN配列がある場合、すべてのN配列に共通の数値をどのように選択しますか。
最初の私の考えは、最初の配列から残りの配列に至るまで要素を反復処理することでした。しかし、私が正しければ、それはN乗N回の反復になります。そこで、要素をキーとして、値をカウンターとして保持することにより、マップにカウントを追加するソリューションを思いつきました。このように、時間計算量はちょうどNだと思います。以下は私のアプローチのJavaでの実装です。
public static void main(String[] args) {
int[] arr1 = { 1, 4, 6, 8,11,15 };
int[] arr2 = { 3, 4, 6, 9, 10,16 };
int[] arr3 = { 1, 4, 6, 13,15,16 };
System.out.println(commonNumbers(arr1, arr2, arr3));
}
public static List<Integer> commonNumbers(int[] arr1, int[] arr2, int[] arr3) {
Map<Integer, Integer>countMap = new HashMap<Integer, Integer>();
for(int element:arr1)
{
countMap.put(element, 1);
}
for(int element:arr2)
{
if(countMap.containsKey(element))
{
countMap.put(element,countMap.get(element)+1);
}
}
for(int element:arr3)
{
if(countMap.containsKey(element))
{
countMap.put(element,countMap.get(element)+1);
}
}
List<Integer>toReturn = new LinkedList<Integer>();
for(int key:countMap.keySet())
{
int count = countMap.get(key);
if(count==3)toReturn.add(key);
}
return toReturn;
}
これを3つのアレイに対して実行して、どのように機能するかを確認しました。質問はN配列について話しますが、これはまだ当てはまると思います。
私の質問は、時間計算量を念頭に置いてこの問題を解決するためのより良いアプローチはありますか?