秘書の問題は、これと述べた有名な問題です。
- 新しい秘書が必要です
- N人の応募者がいて、一度に1人ずつ面接できます
- 面接後に各応募者を採点できます。あなたのスコアリングシステムは、2人の志願者に同じスコアを与えることはありません
- 応募者に面接した後、すぐに「はい」または「いいえ」を提出する必要があります
- 最高得点の応募者が欲しい
解決策は、最初のfloor(N/e)
応募者にインタビューし、それまでの応募者全員よりも高いスコアを持つ最初の応募者を受け入れることです。申請者のいずれもより高い場合、最後の申請者を返します。おもしろいことに、これは1/e
時間の上位の申請者にパーセントを与えます。 オイラーの番号をe
指します。の値を取得するにはe
は、組み込みのを使用するlog
か、少なくとも5つの小数点にハードコードします。
入力:
以下の一意の非負整数の空でない配列 2^31-1
。
出力:
選択された候補を表す整数。アルゴリズムを明確にするために:
- 最初の最大要素を見つける
floor(N/e)
配列の要素で。 - 残りの要素を反復処理し、手順1で見つかった最大値よりも大きい最初の要素を返します。
- いずれの要素も高ければ、最後の要素を返します。
たとえば、配列が[2,7,4,3,9,20]
であったN = 6
としfloor(N/e) = 2
ます。配列の最初の2つの要素は[2,7]
です。の最大値は[2,7]
です7
。残りの要素は[4,3,9,20]
です。大きい最初の要素7
である9
私たちが戻るので、9
。
テストケース:
[0] => 0
[100] => 100
[100, 45] => 100
[0, 1] => 0
[45, 100] => 45
[1, 4, 5] => 4
[1, 5, 4] => 5
[5, 4, 1] => 1
[5, 1, 4] => 4
[4, 1, 5] => 5
[56, 7, 37, 73, 90, 59, 65, 61, 29, 16, 47, 77, 60, 8, 1, 76, 36, 68, 34, 17, 23, 26, 12, 82, 52, 88, 45, 89, 94, 81, 3, 24, 43, 55, 38, 33, 15, 92, 79, 87, 14, 75, 41, 98, 31, 58, 53, 72, 39, 30, 2, 0, 49, 99, 28, 50, 80, 91, 83, 27, 64, 71, 93, 95, 11, 21, 6, 66, 51, 85, 48, 62, 22, 74, 69, 63, 86, 57, 97, 32, 84, 4, 18, 46, 20, 42, 25, 35, 9, 10, 19, 40, 54, 67, 70, 5, 44, 13, 78, 96]
=> 98
[10, 68, 52, 48, 81, 39, 85, 54, 3, 21, 31, 59, 28, 64, 42, 90, 79, 12, 63, 41, 58, 57, 13, 43, 74, 76, 94, 51, 99, 67, 49, 14, 6, 96, 18, 17, 32, 73, 56, 7, 16, 60, 61, 26, 86, 72, 20, 62, 4, 83, 15, 55, 70, 29, 23, 35, 77, 98, 92, 22, 38, 5, 50, 82, 1, 84, 93, 97, 65, 37, 45, 71, 25, 11, 19, 75, 78, 44, 46, 2, 53, 36, 0, 47, 88, 24, 80, 66, 87, 40, 69, 27, 9, 8, 91, 89, 34, 33, 95, 30]
=> 30
ソリューションはである必要がありますO(n)
。ここn
で、配列の長さです。言語に配列の最大値を検出する組み込み関数がある場合、関数はO(n)
(できれば可能です)。
標準的な抜け穴が適用され、これはコードゴルフですので、あなたの好きな言語で最短の回答をしてください!
e
(例えばPythonの、e=2.71828
より短いimport math;math.E
)
e
使うべきですか?