今日のインタビューの質問はこれです... トピック スタックデータ構造を定義します。この型でスタックの最小要素を取得できる min 関数を実装してください。このスタックでは、min、push、pop を呼び出す時間の計算量は O(1) です。 例:
考える まず、この質問自体は理解しやすいのですが、その実装の難しさは次の 2 つの点にあります。
つまり、pop を実行するときにスタック内の最小の値を削除する場合、スタック内の次の最小の要素をどのように見つけるのでしょうか。また、操作の時間計算量が O(1) であることを確認する必要があります。この時間計算量により、最小値を削除した後に次の最小値を見つけるための走査が制限されるため、これがこの問題の難しさになります。 たとえば、次の最上位要素の値を削除するとします。 最小値は 1 なので、次の図に示すように、削除後に最小値も削除されます。 それでは、3分間考えて、この問題にどう対処するか考えてみましょう〜 問題解決 実際、スタックにプッシュするたびに、現在の要素が最小値より小さいかどうかを判断できます。小さい場合は、元の最小値と最新の最小値を次々にスタックにプッシュできます。このように、pop の呼び出し時に最小値が削除されても、次の要素を取得することで新しい最小値を取得できます。実行プロセスは次のとおりです。 ステップ1 最初の要素をスタックにプッシュします。最初の要素なので、最小値はこの要素の値になります。 ステップ2 以下に示すように、2 番目の要素をスタックにプッシュします。 スタックにプッシュされた要素 3 は 8 より小さいため、スタック内の元の最小値 8 が最初にスタックに格納され、次に 3 がスタックにプッシュされます。 ステップ3 以下に示すように、3 番目の要素をスタックにプッシュします。 スタックにプッシュされた要素 5 は 3 より大きいため、スタック内の最小値は変更されず、要素 5 が直接スタックにプッシュされます。 ステップ4 以下に示すように、スタックをプッシュし続けます。 スタックにプッシュされた要素 1 は 3 未満なので、元の最小値 3 が最初にスタックにプッシュされ、次に 1 がスタックにプッシュされ、スタック内の最小値が 1 に変更されます。 ステップ5 次の図に示すように、ポップ操作を実行します。[画像のアップロード中...(image-f68dcf-1602769401330-6)] 要素 1 がスタックからポップされ、現在の要素がスタックの最小値であると判断されるため、次の図に示すように、最上位の要素 3 が最小値に設定され、要素 3 が削除されます。 ステップ6 以下に示すように、スタックのポップを続けます。 要素 5 は現在の最小値ではないため、スタックから直接ポップされます。 ステップ7 以下に示すように、スタックのポップを続けます。 ポップされた要素 3 は最小値なので、次の図に示すように、引き続き最小値を最上位要素 8 に設定し、最上位要素をポップします。 この方法では、残る要素は 1 つだけです。最後の要素がスタックからポップされると、スタックは空になり、プロセス全体が完了します。 実装コード1 次に、上記のアイデアをコードで実装します。配列によって実装されたスタックを使用して、関連する機能を実装します。コードは次のとおりです。
LeetCode での上記コードの実行結果は次のとおりです。 パフォーマンスは依然として非常に高く、ユーザーの 99.92% を超えており、メモリ消費量も大きくないことがわかります。そのコアコードは push メソッドにあり、最初に元の最小値と最新の最小値をスタックに次々にプッシュします。スタックをポップするときに、ポップされた要素が最小値かどうかを判断します。最小値の場合、現在の最小値はスタックの先頭要素を指し、スタックの先頭要素がポップされ、次の新しい最小値が得られます。 実装コード2 カスタム配列スタックを使用したくない場合は、Java の組み込みスタックを使用してこの関数を実装することもできます。コードは次のとおりです。
LeetCode での上記コードの実行結果は次のとおりです。 結果から、Java の組み込みスタックを使用した場合のパフォーマンスはカスタム配列のスタックほど良くないことがわかりますが、それでもコードはテストに合格しました。この実装の利点は、コードが比較的単純であり、Java 独自の API を使用して最小値の検索を完了できることです。 このコードの実装方法 (Java API を使用) は、特に指定がない限り、質問の練習や実際の面接で直接使用できます。 要約する この記事では、カスタム配列スタックと Java API の Stack という 2 つの方法を使用して、スタック内の最小値関数を実装し、スタックの min、push、pop メソッドを呼び出すときの時間計算量が O(1) になるようにします。 2 つの実装方法のコードは若干異なりますが、実装の考え方は同じです。要素をスタックにプッシュするときに、現在の要素が最小要素より小さいかどうかを判断します。最小要素より小さい場合は、最初に元の最小値がスタックにプッシュされ、次に現在の最小要素がスタックにプッシュされます。このように、pop メソッドが呼び出されると、最小値が削除されても、次の要素を取り出して新しい最小値にするだけで済みます。このようにして、min、push、および pop メソッドの呼び出しの時間計算量は O(1) として達成できます。 |
<<: 新しいドローン産業は急速に発展しているが、まだ3つの大きな障害を取り除く必要がある。
>>: 完全なグラフが利用できない場合にグラフディープラーニングを使用するにはどうすればよいでしょうか?
時代の発展と科学技術の進歩に伴い、ロボットは人々の生活の場にますます入り込んできましたが、私たちの従...
過去数十年にわたり、AI ツールは、コンピューター サイエンスから製造、医学、物理学、生物学、さらに...
平均と分散のマップ削減一連の数値の平均と分散の式は誰にとっても明らかだと思います。マップ関数とリデュ...
ラフル・プラダン出典| https://www.infoworld.com/article/3708...
2017年、『エコノミスト』誌は、石油ではなくデータが世界で最も価値のある資源になったと宣言しました...
グラフディープラーニング(GDL)は有望な研究分野であり、グラフデータに基づいた学習や分析は非常に有...
顔スキャン決済は私たちの生活に入り込んでいます。普通のスマートフォンのカメラに顔を向けるだけで、本人...
Microsoft Research Asia の最新の調査は少々衝撃的だ。彼らは、実際にトークンを...
11月28日、アリババクラウドは、世界初の統合バッチ・ストリームアルゴリズムプラットフォームでもある...
単一の画像に基づく 3 次元再構成は、重要な応用価値を持つタスクですが、実装が非常に難しく、モデルに...