設計一個支持 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]
方案一
方案二
公衆號:《程序員養成記》
主要寫算法、計算機基礎之類的文章, 有興趣來關注一塊兒成長!