k番目に小さい要素

整数 n 個とある数 k が与えられたとき、リストの中で k 番目に小さい要素を求めてください。配列の要素がすべて異なることは保証されています。

入力

最初の行には、2 つの整数 nk が与えられます (1 ≤ k ≤ n ≤ )。
次の行には、n 個の整数 () が空白区切りで与えられます。

出力

与えられたリストの中で、k 番目に小さい要素を出力してください。

入力
出力
6 3 10 -2 4 8 3 6
4
7 2 -4 5 8 -3 10 0 7
-3

解説

  1. リストをソートすると [-2, 3, 4, 6, 8, 10] となり、ここで 3 番目に小さい要素は 4 です。
  1. リストをソートすると [-4, -3, 0, 5, 7, 8, 10] となり、2 番目に小さい要素は -3 です。
 
ヒント 1
QuickSort(クイックソート)のようにランダムな基準値(ピボット)を使って配列を分割する方法を利用できます。
要素数が の配列を単純にソートするのは、通常の時間制限では厳しいことがあります。
ヒント 2
ランダムに選んだピボットを使って配列を仕分けしたら、必要な部分だけを残し不要な部分は捨ててください。
この操作を繰り返し、捨てた要素の数が先にある k 番目の要素に対応するところまで行えばいいのです。
ランダムな分割を行うと平均的には線形時間 が期待できます。なぜだと思いますか?
ヒント 3
ランダムにピボットを選んで配列を分割するたびに、平均的には配列の大きさが半分になります。つまり、サイズ n の配列から始めたとすると、1 回目の分割後に n/2 が捨てられ、2 回目は n/4 分が捨てられ… という形で、合計すると捨てている量はおよそ n + n/2 + n/4 + ... = 2n となります。
ただし、ピボットが常に最悪の位置を引き当ててしまうと、最悪計算量は になる可能性があります。
 

Constraints

Time limit: 2.5 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue