20.スタックは、関数minを含みます
問題:
スタックデータ構造定義、最小の要素は、スタックに含まmin関数であることができるこのタイプの実装(べき時間複雑性O(1))。
注:スタックが空でない場合、テストがあることを保証するために、スタックポップ()または分()または上部()メソッドを呼び出します。
ソリューション:
思想:
この質問を参照してください、あなたは押し要素を押すたびに、現在の最小の要素よりも小さい場合、我々は最初に、最小の要素を保持するためのメンバ変数を追加したい場合があります、最小の要素が更新されます。
しかし、これは問題になり、最小要素がそれをポップであれば、どのようにそれの次の最小の要素を取得するには?分析はここで見つけることができ、ちょうど最小の要素を格納するためのメンバ変数を追加するに十分な、我々はまた、二番目に小さいポップの最小要素で次の最小の要素を取得する必要がありますされていませんポップアップした後、だけでなく、時間や小さな取得する。
したがって、これらの要素を保存するために別のスタックに理想的なフィット感です。私たちは、スタックの最小の要素と呼んでいます。
それぞれの時間プッシュ操作、現在よりも押し要素場合最小の要素が小さく、素子積層体を入れ、オリジナルの最小の要素は次の最小要素となるように、最小の要素に圧入。同様に、ポップ場合、上部要素をポップアップ要素と最小要素のスタックが等しい場合、最小値を入れポップの先頭要素。
Pythonコード:
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack=[]
self.minstack=[]
def push(self, node):
# write code here
self.stack.append(node)
if(not self.minstack or node < self.minstack[-1]):
self.minstack.append(node)
def pop(self):
# write code here
if(self.stack[-1]==self.minstack[-1]):
self.minstack.pop()
self.stack.pop()
def top(self):
# write code here
return self.stack[-1]
def min(self):
# write code here
return self.minstack[-1]