A1、A2、... An を n 個の配列とします。
すべての配列がソートされていると仮定すると、そうでない場合は個別にソートできます。
S = [ A1[0], A2[0],...An[0] ]
minSpread = max{S} - min{S}
Iterate i = 1 to L (where L is length of shortest array)
Remove min{S} from S.
Insert Ak[i] in S. (where Ak is the kth array from which a value was removed in previous step.)
minSpread = min(minSpread, max{S} - min{S});
スプレッド (最大 - 最小) を最小化する必要があるため、現在の最小値を削除して最小値を「上に」絞るしかありません。
O(N) + O(N*L*logN) で計算されます。N は no です。配列の長さで、L は最短の配列の長さです。
これは、検索結果の表示中によくある問題です。指定されたすべての検索語を含むページからの抜粋の可能な限り小さいウィンドウを表示する必要がある場合。
ここで、A1[] A2[]... An[] には、単語 say-W1、W2... Wn の出現のインデックスが含まれています。
編集:
ニモ:その通りです。証明は少し複雑です。あなたが提供したリンクは、同様の解決策を試みています。追加できるのは次のとおりです。
事実を考慮する:
1. 各配列から正確に 1 つの要素を維持する必要があります。
2. 配列はすべて昇順でソートされます。
多くの組み合わせをすぐに破棄して、すべての組み合わせを生成するよりも良い時間で破棄できるようにしてください。詳細については、「Nemo」が提供するリンクを参照してください。
そして、提案されているように最小ヒープを維持することで、複雑さを O(N) + O(N*L*logN) に下げることができます。
ここで、N はいいえです。L は最短配列の長さです。