解決策はO(N)
であり、微積分を実行する必要はありませんが、曲線の形状を理解するのに役立ちます。
上記の答えは、最も直感的なことを行い、方程式を解いて最小値または最大値を見つけてリストを分割します。
一次導関数を計算する際に利点がありますが、実際に行う必要はなく、現時点で最大点または最小点を見つける必要はありません。
一方向に移動してからもう一方の方向に戻ることができますが、方向は何度も変わることはありません。
私たちはそれぞれの端から始めて、真ん中のどこかでマージするまで両側から反復します。他に何かをする前に、最後の2つの要素を比較するだけで、それぞれの方向を確認する必要があります。そこで、一方の端が上に移動し、もう一方の端が下に移動しているかどうかを確認します。
我々はN
要素を持っている場合我々はそうf(X[0])
とf(X[N-1])
とf(X[1])
とf(X[N-2])
を計算し、データX[0]
とX[N-1]
を持っているとしましょう。 f(X[0]) < f(X[1])
とf(X[N-1]) > f(X[N-2])
の場合、実際にはすべてのデータは最大値/最小値の片側であるため、すでにソートされています。比較が他の方向にある場合も同じです。(一方向は逆にする必要があります)。
それ以外の場合は、両端のマージを実行してください。したがって、f(X[0])
とf(X[N-1])
は、サブレンジの最大値または最小値です(これまでの比較からわかります)。そして、どちらか適切な方向からマージリストを作成します。あなたのデータに適用
:
-1 0 1 2 3 4
A = -1, B = 2, C = -1`
f = [ -4, -1, 0, -1, -4, -9 ]
-4 < -1
と-9 < -4
ので、我々はポイントを横断行い、私たちは各端で最小値を持っています。
-9 is lower than -4
-4 and -4 are equal so push both
-1 and -1 are equal so push both
0 remains.
our sequence is [-9, -4, -4, -1, -1, 0 ]
あなたのメソッドは 'n log n'です。 – jason
O(logN)時間でソート?あなたはO(N * LogN)時間でなければなりません... O(NLogN)未満で乱数コレクションをソートできないことが数学的に証明されています –
彼はO(N)解決策を期待していました。 – harishhkamat