古いドライウェルがあります。その側面はコンクリートのリングで作られています。このような各リングの高さは1メートルですが、リングの直径は異なる場合があります。それにもかかわらず、すべてのリングは互いに中心にあります。井戸の深さはNメートルです。つまり、その中にN個のコンクリートリングがあります。M個のコンクリートディスクを井戸に落とそうとしています。各ディスクの厚さは1メートルで、ディスクごとに直径が異なる場合があります。各ディスクがドロップされると、次の状態になるまでフォールダウンします。
- それは井戸の底に当たります。
- 内径がディスクの直径よりも小さいリングに当たります。また
- 以前にドロップされたディスクにヒットします。(リングの内径とディスクの直径が等しい場合、ディスクがリングを通り抜ける可能性があることに注意してください。)
ドロップしようとしているディスクの準備ができており、それらの直径と、ウェル内のすべてのリングの直径がわかっています。疑問が生じます:何枚のディスクが井戸に収まるでしょうか?
関数を記述します:intfalling_disks(int A []、int N、int B []、int M); つまり、整数の2つのゼロインデックス配列が与えられた場合-AはNリングの内径を含み(上から下の順序)、BはMディスクの直径を含みます(ドロップされる順序で)-ウェルに収まるディスクの数を返します。たとえば、次の2つの配列があるとします。
A[0] = 5 B[0] = 2
A[1] = 6 B[1] = 3
A[2] = 4 B[2] = 5
A[3] = 3 B[3] = 2
A[4] = 6 B[4] = 4
A[5] = 2
A[6] = 3
最後のディスクを除くすべてがウェルに収まるため、関数は4を返す必要があります。この図は、4つのディスクをドロップした後の状況を示しています。
と仮定する:
- Nは[1..200,000]の範囲内の整数です。
- Mは[1..200,000]の範囲内の整数です。
- 配列Aの各要素は、[1..1,000,000,000]の範囲内の整数です。
- 配列Bの各要素は、[1..1,000,000,000]の範囲内の整数です。
複雑:
- 予想される最悪の場合の時間計算量はO(N)です。
- 予想される最悪の場合のスペースの複雑さは、入力ストレージを超えたO(N)です(入力引数に必要なストレージはカウントされません)。
- 入力配列の要素は変更できます。
スタックを使用して何かを実行しようとしましたが、O(n)ソリューションに到達できません。いくつかの最適化を行った後でも、最悪のケースはO(n ^ 2)のままです。