私は、次の面接の質問を見つけたここに。
SortedIteratorは - 各リストのソートされたint型の値を持つリストのリストで構成されています。あなたは)次の(を呼び出すときに、次のソート値を与える必要があります。
次* *コンストラクタメソッドを実装する必要がある()*のhasNext()
[1、4、5、8、9]、[3、4、4、6]、[0,2]、[8]]
次の() - > 0、1、2、3、4、4、4 ...
私はJavaで迅速な実装を書きました:
package com.app;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class SortedIterator implements Iterator<Integer> {
private final List<Integer> mFlattenedList;
private final Iterator<Integer> mIntegerIterator;
SortedIterator(final List<List<Integer>> lists) {
mFlattenedList = flattenLists(lists);
mIntegerIterator = mFlattenedList.iterator();
}
private List<Integer> flattenLists(final List<List<Integer>> lists) {
final List<Integer> result = new ArrayList<>();
for (List<Integer> list : lists) {
for (int value : list) {
result.add(value);
}
}
Collections.sort(result);
return result;
}
@Override
public boolean hasNext() {
return mIntegerIterator.hasNext();
}
@Override
public Integer next() {
return mIntegerIterator.next();
}
}
時間:O(K * N)は、平坦化リスト= O(N * K)を反復処理するためにリスト+ O(N * K)の入力リストを平坦化します
スペース:O(N * K)が平坦化されたリストを格納します。
N - リストの数。
K - 各リスト内の要素の数。
しかし、その答えのリンクからは言います:
プライオリティキューを使用して、時間の複雑さO(logN個)での解決策があります。たぶん、インタビュアーがそのような何かを期待し、私は知りません。
どのようにO (log N)
可能?プライオリティキューを使用する場合、我々は呼び出すたびは、hasNext()
キューが空の場合、我々は(チェックする必要がありますO(1)
)。その後、我々は、呼び出しnext()
キュー(からの分要素を抽出するO(log (N*K)
に応じて)任意の実装のための)テーブル。私たちが呼び出す必要があるので、next()
N * K回、それが私たちを取るO(N * K * log (N*K)
すべての要素を反復処理します。
ソリューションのO(logN個)複雑複雑である要素ごとではなく、すべての値を反復処理するために複雑。
解決策は次のようになります。
ファーストと呼ばれる新しいクラスの定義
ListValue
値を格納するだけでなく、それがどこから来たのリストのインデックスということを。これらは、他に匹敵する必要がありますListValue
値を使用してオブジェクト。コンストラクタ:初期化
PriorityQueue<ListValue>
と呼ばれるpq
とにNリストのそれぞれから最初の要素を配置しますpq
。次の():ポップ
ListValue
の目の前でpq
。値内部が返される値であるが、第一、それから、次の要素を移動するListValue
にのリストpq
。私たちは一つの要素を削除し、1つの要素を追加するので複雑さは、O(Nを記録)でpq
、ほとんどのN個の要素に含まれています、。
解決策は、Nリストのそれぞれから、一度にプライオリティキューにのみ、単一の「次」の値を、すべてのN * Kの値を保持しないことに注意してください。したがって、プライオリティキューは、その操作は全てOであるように、(Nログ)、(最大で)を有するN常時要素。
なぜこれが作品を理解するために、リコールは、各リストがすでにソートされているので、最小の未使用の値が(すでに消費された値は含まない)いくつかのリストの「前」に指定する必要があります。次に、プライオリティキューが正確に各リストの「前」の要素を含むことに注意してください-私たちは中に行われるように強制しnext()
、我々はに要素を追加するときpq
、我々は削除要素と同じリストから。したがって、常時pq
(全ての値が使い果たされるまで)最小の未使用値を含むであろう。