設計一個有getMin功能的棧

題目

設計一個支持 push,pop,top 操做,並能在常數時間內檢索到最小元素的棧。程序員

push(x) -- 將元素 x 推入棧中。
pop() -- 刪除棧頂的元素。
top() -- 獲取棧頂元素。
getMin() -- 檢索棧中的最小元素。

示例:算法

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

思路

設計時使用兩個棧
一個棧用來保存當前棧中的元素,記爲stack_data
一個棧用於保存每一步的最小值,記爲stack_minapp

方案一

新元素x入棧設計

1.數據x將要入棧,先入棧stack_datacode

2.判斷棧stack_min是否爲空,爲空x直接入stack_min,不然判斷stack_min棧頂元素和x的大小,若是x小於或者等於棧頂元素,則x入棧stack_min,大於則不作處理get

3.獲取棧的最小值則返回stack_min的棧頂元素it

元素出棧class

1.stack_data棧正常彈出棧頂元素y基礎

2.判斷stack_data彈出的元素y與stack_min棧頂元素的大小,若是y等於棧頂元素,則stack_min也彈出棧頂元素程序

方案二

新元素x入棧

1.數據x將要入棧,先入棧stack_data

2.判斷棧stack_min是否爲空,爲空x直接入stack_min,不然判斷stack_min棧頂元素和x的大小,若是x小於或者等於棧頂元素,則x入棧stack_min,大於的話則把stack_min的棧頂元素重複壓入stack_min

元素出棧

1.stack_data棧正常彈出棧頂元素y

2.stack_min棧正常彈出棧頂元素z

3.獲取棧的最小值則返回stack_min的棧頂元素

代碼

方案一

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack_data = []
        self.stack_min = []

    def push(self, x: int) -> None:
        self.stack_data.append(x)
        if self.stack_min:
            if x <= self.stack_min[-1]:
                self.stack_min.append(x)
        else:
            self.stack_min.append(x)

    def pop(self) -> None:
        if self.stack_data and self.stack_min:
            if self.stack_min[-1] == self.stack_data.pop():
                self.stack_min.pop()

    def top(self) -> int:
        if self.stack_data:
            return self.stack_data[-1]

    def getMin(self) -> int:
        if self.stack_min:
            return self.stack_min[-1]

方案二

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack_data = []
        self.stack_min = []

    def push(self, x: int) -> None:
        self.stack_data.append(x)
        if self.stack_min:
            if x <= self.stack_min[-1]:
                self.stack_min.append(x)
            else:
                self.stack_min.append(self.stack_min[-1])
        else:
            self.stack_min.append(x)

    def pop(self) -> None:
        if self.stack_data and self.stack_min:
            self.stack_data.pop()
            self.stack_min.pop()

    def top(self) -> int:
        if self.stack_data:
            return self.stack_data[-1]

    def getMin(self) -> int:
        if self.stack_min:
            return self.stack_min[-1]

複雜度分析

方案一

  • 時間複雜度:O(1),「出棧」、「入棧」、「查看棧頂元素」的操做和數據量的多少無關,都是有限的步驟
  • 空間複雜度:O(n)
  • 方案一壓入時稍省空間,彈出稍費時間

方案二

  • 時間複雜度:O(1),「出棧」、「入棧」、「查看棧頂元素」的操做和數據量的多少無關,都是有限的步驟
  • 空間複雜度:O(n)
  • 方案二壓入時稍費空間,彈出稍省時間

公衆號:《程序員養成記》 

主要寫算法、計算機基礎之類的文章, 有興趣來關注一塊兒成長!

相關文章
相關標籤/搜索