これはおそらくマイクロソフトのインタビューの質問です。
ソートされた配列から k 番目に小さい要素 (重複を無視) を見つけます。
[編集] : 配列には重複が含まれる場合があります (指定されていません)。
何度も考えましたが、まだ自問自答しています:もっと良い解決策がまだありますか?
アプローチ 1:
最大ヒープを取得し、最初の k 個の一意の要素を挿入します [簡単に確認できます]。ヒープをヒープ化します。
ここで、新しい要素がヒープのヘッドよりも小さい場合、ヘッドをこの新しい要素に置き換えてヒープ化します。最後に、ヒープのサイズが k の場合、ヒープの先頭は k 番目に小さい要素を示します。そうでない場合、k 番目に小さい要素は存在しません。
時間計算量: O(NlogK)
空間計算量: O(K)
アプローチ 2[より良いアプローチ]:
要素は正しく複製できます。そのため、前の要素と比較して一意の要素を確認し、これまでに見つかった一意の変数が k までカウントされたら停止します。
時間の複雑さ: O(N)
空間の複雑さ: O(1)
アプローチ3[より良いアプローチ(かもしれません)]:
クイック ソート パーティション アルゴリズムの修正版も使用できます。しかし、配列がすでにソートされているため、最悪のケースにつながる可能性があります。
ここで 2 つの疑問が生じます:
1.配列に重複が含まれていても機能しますか?
2. 2 番目のアプローチよりも優れていますか?
O(logn)ソリューションが存在するのではないかと思っていましたか?