選択アルゴリズムが失敗する理由:
選択アルゴリズムの使用は #elements で線形であることに注意してください。#requests が #elements で線形であると仮定すると、二次解につながります。これが制限時間を超える理由です。
別のアプローチ:
最大ヒープH1
と最小ヒープの 2 つのヒープを維持するH2
最大ヒープ ( H1
) は 2/3 の最小値を保持し、最小ヒープは 1/3 の最大値を保持します。
次に、読み取った要素ごとにx
、トップ 1/3 ヒープ ( H2
) を増やす必要があるかどうかを確認します。必要な場合は、 を追加する必要がありますmax{x,H1.max()}
。追加した場合H1.max()
は、ヒープから削除し、x
代わりに挿入する必要があります。追加が必要ない場合は、 が より大きいかどうかを確認し、x
大きい場合はH2.min()
最小フォームを削除してH2
に挿入しH1
、 に追加x
しH1
ます。
注: このソリューションで探している数はO(1)
、いつでも見つけることができます。これは、最小ヒープ ( H2
) の最小値です。
このソリューションの複雑さの合計O(nlogn + k)
- ここでn
は数字の数、k
は「数字を伝える」リクエストの総数です。
注: より簡単な解決策 (おそらく遅くなりますが) は、並べ替えられたリストを維持し (たとえば、BSTまたはスキップリストで)、二分探索を使用して関連する要素を探すことです。
例:
init:
H1 = {}
H2 = {}
input1:
H1 = {1}
H2 = {}
input7:
H1={1,7}
H2 = {}
input 9: //need to add a max, in this case: x > H2.max() -> add x to H2.
H1 = {1,7}
H2 = {9}
tell the number
H2.min() = 9
input 21: // 21>9 -> remove H2.min() add it to H1, add x to H2
H1 = {1,7,9}
H2 = {21}
input 8:
H1 = {1,7,8,9}
H2 = {21}
input 5: //remove max from H1, add max to H2, add x to H1
H1 = {1,7,5,8}
H2 = {9,21}
tell the number
H2.min() = 9
input 11: //remove min from H2, add it to H1, add x to H2.
H1 = {1,7,5,8,9}
H2 = {11,21}
tell the number
H2.min() = 11