ホームページ  >  記事  >  バックエンド開発  >  スタック面接の質問を PHP_PHP チュートリアルで解決する

スタック面接の質問を PHP_PHP チュートリアルで解決する

WBOY
WBOYオリジナル
2016-07-13 10:26:26903ブラウズ

はじめに

面接で質問がありました。質問の一般的な意味は次のとおりです。

2 つの通常のスタックを使用して特別なスタックを実装します。これにより、pop、push、min 関数はすべて複雑度 O(1) の操作になります。 min 関数は、現在のスタックの最小値を取得します。

最初の考え

1. (1)の操作としてmin関数を実装するには、その時の最初のアイデアは、現在の最小値を事前に計算することでしたので、現在のスタックに最小の要素を保存し、それを維持する値を使用することを考えました。これはプッシュおよびポップ操作中の値です。このように、min と Push は両方とも O(1) ですが、pop はそうではありません。現在のポップアップが最小値の場合は、O(1) ではない現在の要素の最小値を再度見つける必要があります。 。

2. さらに、上記の方法では別のスタックを使用しなかったため、図に示すように、ソートされた要素をスタックに格納し、プッシュおよびポップ操作中にこの順序付けされたスタックも維持することを考えました。

ただし、この場合、最小操作は O(1) ですが、プッシュ操作とポップ操作はこの順序付けられたスタックを維持する必要があるため、O(1) の複雑さを達成できるメソッドは思いつきません。

その時は、最小値の情報を別のスタックにキャッシュしておくべきだと思ったのですが、食事をしなかったのか何か分からず思考がフリーズしてしまいました。

正しい解決策

問題に遭遇して解決できないととても悔しかったので、スタックの特性をしっかり理解し、min演算で使用する最小値情報を効果的にキャッシュする方法を食事しながら考え始めました。

スタック操作の最大の特徴は、スタックの最上位の要素に対してのみ操作できることです。各スタック操作の最小値をキャッシュするために補助スタックを使用するという考えは正しくありません。このようにして、補助スタックの最上位要素が現在のスタックの最小値であるため、ポップ操作が実行されるたびに両側を一緒にポップできます。プッシュ操作では、プッシュされた要素と最上位要素を比較するだけで済みます。補助スタックの。このように、push、pop、min はすべて O(1) 操作です。写真に示すように:

テキストが明確ではないかもしれません。以下のコードは、配列を介してスタックをシミュレートする PHP 実装です。

リーリー

次のように使用します:


コードをコピーします コードは次のとおりです:
$obj = 新しい strack();
$obj->push(12);
$obj->push(56);
$obj->push(23);
$obj->push(89);
$obj->push(4);
var_dump($obj->min());
$obj->pop();
var_dump($obj->min());
$obj->push(8);
var_dump($obj->min());

出力は次のとおりです:


コードをコピーします コードは次のとおりです:
int(4)
int(12)
int(8)

OK、要件は満たされました。

それを達成するための他のより良い方法がある場合は、教えてください^_^

http://www.bkjia.com/PHPjc/824668.html

tru​​ehttp://www.bkjia.com/PHPjc/824668.html技術記事はじめに インタビューで質問がありました。その質問の一般的な意味は次のとおりです。pop、push、min 関数がすべて O(1) の複雑さを持つ操作になるように、2 つの通常のスタックを使用します。最小関数...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。