1. 程式人生 > >LeetCode.155.最小棧

LeetCode.155.最小棧

155.最小棧
設計一個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。

  • push(x) – 將元素 x 推入棧中。
  • pop() – 刪除棧頂的元素。
  • top() – 獲取棧頂元素。
  • getMin() – 檢索棧中的最小元素。
    構建兩個棧
    資料棧:一個用來儲存資料的棧。
    最小索引棧:另一個棧的每一位i,用來儲存前i位(包括第i位)的最小數的索引。
    getMin():取出最小值操作:返回最小索引棧的最後一位,即當前棧的最小值的索引。

python程式碼如下:

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        初始化兩個棧,
        一個棧用來儲存資料
        另一個棧用來儲存前i位最小值的索引
        """
        self.stack = []
        self.stackindex = []
        
    def stack_empty(self):
        """
        判斷當前棧是否為空
        """
        return len(self.stack) == 0
    
    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if self.stack_empty():
            self.stackindex.append(0)      #如果資料棧為空,索引棧就應該新增索引0.即初始位置
        else:
            if x < self.stack[self.stackindex[-1]]:
                self.stackindex.append(len(self.stackindex))#如果當前新增的數是更小的數,索引棧新增資料棧長度為新的最小值的索引
            else:
                self.stackindex.append(self.stackindex[-1])#如果不是更小的數,索引棧就新增此時索引棧的最後一位的值
        self.stack.append(x)
        
    
    def pop(self):
        """
        :rtype: void
        """
        if self.stack_empty():
            raise Exception("under flow")   #資料棧為空丟擲下溢異常
        else:
            del(self.stackindex[-1])  #刪除索引棧的最後一位
            return self.stack.pop()

    def top(self):
        """
        :rtype: int
        """
        return self.stack[-1]
        

    def getMin(self):
        """
        :rtype: int
        """
        return self.stack[self.stackindex[-1]]  #資料棧最小值的索引儲存在索引棧的最後一位