1172【leetcode】。ディナープレートスタック

次のように内容は次のとおりです。

あなたが一列に配置され、番号スタックの無限数がスタックの各々は、同じ最大値を有する、0から(左から右へ)を有します  capacity

実装  DinnerPlates クラスを:

  • DinnerPlates(int capacity) 最大でオブジェクトを初期化  capacity スタックの。
  • void push(int val) 任意の正の整数をプッシュ  val 未満の大きさの左端スタックに  capacity
  • int pop() 右端の非空のスタックの一番上にある値を返し、そのスタックからそれを削除し、返します  -1 すべてのスタックが空の場合。
  • int popAtStack(int index) 所与とスタックの最上部に値を返し  index 、そのスタックから削除し、-1を返し、所与のものとスタックがあれば  index 空です。

例:

入力:
[ "DinnerPlates"、 "プッシュ"、 "プッシュ"、 "プッシュ"、 "プッシュ"、 "プッシュ"、 "popAtStack"、 "プッシュ"、 "プッシュ"、 "popAtStack"、 "popAtStack"、 "ポップ" 、 "ポップ"、 "ポップ"、 "ポップ"、 "ポップ"] 
[2]、[1]、[2]、[3]、[4]、[5]、[0]、[20]、 [21]、[0]、[2]、[]、[]、[]、[]、[]] 
出力[NULL、NULL、NULL、NULL、NULL、NULL、2、NULL、NULL、20、 21,5,4,3,1、-1] 

説明:
DinnerPlatesのD = DinnerPlates(2)。//容量と初期化= 2 
D.push(1)。
D.push(2)。
D.push(3)。
D.push(4)。
D.push(5)。//スタックは次のようになります。 
D.popAtStack(0)。スタック2. //戻り値は次のようになります。4
                                                       1 3 5 
D.popAtStack(2)。//戻り値21.スタックは次のようになります。4
                                                       ﹈﹈﹈ 
D.push(20)。//スタックは今である:20 4 
                                           1 3 5 
                                           ﹈﹈﹈ 
D.push(21)。//スタックは今である:20 4 21 
                                           1 3 5 
                                           ﹈﹈﹈ 
D.popAtStack(0)。//戻り20.スタックは今である:4 21 
                                                        1 3 5 
                                                        ﹈﹈﹈ 
                                                        1 3 5 
                                                        ﹈﹈﹈ 
スタックは今5を返す// D.pop():4 
                                                        1 3 
                                                        ﹈﹈   
4を返し// D.pop()スタックが今である:1 3 
                                                        ﹈﹈    
D.pop() 1:// 3.スタックが今ある返し
1.何のスタックはありませんを返します// D.pop()。
D.pop()//は-1を返します。何のスタックはまだありません。

 

制約:

  • 1 <= capacity <= 20000
  • 1 <= val <= 20000
  • 0 <= index <= 100000
  • せいぜい  200000 呼び出しに行われる  push、  popと  popAtStack

問題解決のアイデアを:このタイトルは、私は1つがstack_listので、スタック情報を保存し、3つのリストを過ごした。一つはnonEmptyStackで、現在のレコードが空の添字スタックではありません。それはまたavailableStackで、スタックの現在のレコードよりも少ないですマーク。POP動作は見つけることであり、プッシュのみ全て添字availableStackの最小値を見つける必要がある場合、スタックは、対応する、availableStackが空の場合、新しいスタック、挿入stack_listに挿入され、ステータスavailableStackとnonEmptyStackを更新することができます最大nonEmptyStackの場合には、それらの対応するスタックポップ操作を行い、そしてpopAsStackより簡単な操作で、直接添字stack_listによってアクセスすることができます。スタックの各availableStack nonEmptyStackを同期して更新される任意のアクションがあることに注意してください。それが最大または最小availableStackとnonEmptyStackを求めているのであなただけはバイナリ検索を使用することができますavailableStackとnonEmptyStackを更新するためにavailableStackとnonEmptyStack要素を維持する必要があります。

コードは以下の通りであります:

クラスDinnerPlates(オブジェクト):

    デフ __init__ (自己容量):
         "" " タイプ容量:INT 
        """ 
        self.stack_list = [] 
        self.availableStack = [] 
        self.capacity = 容量
        self.nonEmptyStack = [] 

    DEF プッシュ(自己、ヴァル):
         "" " タイプのval:int型
        :RTYPE:なし
        """ 
        もし lenは(self.availableStack)== 0:
            INX = LEN(self.stack_list)
            self.availableStack.append(LEN(self.stack_list))
            self.stack_list.append([ヴァル])
             場合でlen(self.stack_list [INX])< self.capacity:
                self.availableStack.append(INX)
        
            INX = self.availableStack [0] 
            self.stack_list [INX] .append(ヴァル)
            場合でlen(self.stack_list [INX])> = self.capacity:
                self.availableStack.pop(0)
        輸入二分
        b_inx = bisect.bisect_left(自己.nonEmptyStack、INX)
         場合 b_inx == -1 又は b_inx == LEN(self.nonEmptyStack)又はself.nonEmptyStack [b_inx] =!INX:
            bisect.insort_left(self.nonEmptyStack、INX)


    デフ(自己)ポップ:
         "" " 
        :RTYPE:int型
        """ 
        もし lenは(self.nonEmptyStack)== 0:
             返す -1 
        INX = self.nonEmptyStack [-1 ] 
        V = self.stack_list [INX] .pop(-1 場合でlen(self.stack_list [INX])== 0:
            self.nonEmptyStack.pop( -1 リターンV 


    DEF popAtStack (自己、インデックス
        ):""」 
        :型インデックス:int型
        :RTYPE:int型
        """
        輸入二分
        b_inx = bisect.bisect_left(self.nonEmptyStack、インデックス)
         場合 b_inx == -1 または b_inx == LEN(self.nonEmptyStack)または self.nonEmptyStack [b_inx] =!インデックスは:
             返す -1 
        V = self.stack_list [インデックス] .pop(-1 場合 LEN(self.stack_list [インデックス])== 0:
             デルself.nonEmptyStack [b_inx] 

        b_inx = bisect.bisect_left(self.availableStack、指数)
         場合 b_inx == -1またはb_inx == LEN(self.availableStack)または self.availableStack [b_inx] =!インデックス:
            bisect.insort_left(self.availableStack、インデックス)

        リターン V

 

おすすめ

転載: www.cnblogs.com/seyjs/p/11520402.html