""
LeetCode 155:最小棧 Min Stack
設計一個支持 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。
- push(x) -- 將元素 x 推入棧中。
- pop() -- 刪除棧頂的元素。
- top() -- 獲取棧頂元素。
- getMin() -- 檢索棧中的最小元素。
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
解題思路:
起初我以為定義一個指針指向最小值即可,後面才想到在棧中彈出元素時,如果彈出的元素是最小值,那這個指針就需要更 改選擇另一個最小元素。沒辦法,想做到入棧出棧和彈出最小值均為 O(1) 的時間複雜度,那麼只能犧牲空間來換。可以另外新建一個棧來順序存入數據最小值。
注意:Python中沒有單獨的 Stack 數據結構,其實它的數組就有彈出和壓入功能。也可以用 collections.deque() 數據結構。 另外在數據入棧時需要判斷該值是否比輔助棧的棧頂元素的值更小,如果更小,也應該將它加入輔助棧。並且需要判斷輔助棧是否為空,在不空的條件下才可以取棧頂元素比較,否則會溢出。
事實上每次都要調用函數判斷是否為空這個操作,相對這道題的運行時間來說很耗時,就這道題而言是可以避免的,只需給輔助棧加入整型最大值作為棧底元素即可。
Java:
class MinStack {
Stack<Integer> s1 = new Stack<>();//初始化棧
Stack<Integer> s2 = new Stack<>();//輔助棧順序存入最小值
public MinStack() {
s2.push(Integer.MAX_VALUE);//先加入整型最大值在棧底,避免判斷輔助棧是否為空
}
public void push(int x) {
s1.push(x);
if (s2.peek() >= x) s2.push(x);//比棧頂元素值小或相等就加入輔助棧
}
public void pop() {
int tmp = s1.pop();
if (tmp == s2.peek()) s2.pop();//彈出棧的元素值如果和輔助棧頂元素值相等,也在輔助棧彈出它
}
public int top() {
return s1.peek();//返回棧頂元素
}
public int getMin() {
return s2.peek();//返回輔助棧棧頂元素即是最小值
}
}
Python3:
class MinStack:
#初始化數據結構(數組),s2作為輔助棧加入整形最大值做棧底,避免判斷輔助棧是否為空
def __init__(self):
self.s1 = []
self.s2 = []
self.s2.append(sys.maxsize)
def push(self, x: int) -> None:
self.s1.append(x)
#取棧頂元素直接用數組負值索引 Array[-1] 取最後一個值
if self.s2[-1] >= x: self.s2.append(x)
def pop(self) -> None:
tmp = self.s1.pop()
if tmp == self.s2[-1]: self.s2.pop()
def top(self) -> int:
return self.s1[-1]
def getMin(self) -> int:
return self.s2[-1]
相關推薦
'5㎡左右的最小房間這麼裝!書房、客房、茶室都有啦'
"現在很多戶型,都會有個5㎡左右的房間,開發商美其名曰的:小三房,真是小的可以!“食之無味,棄之可惜”的存在!又做不成客房,拿來做書房,感覺少了一個房間,有點可惜!怎麼讓5㎡的房間,搖身一變成集客房、書房等於一身的多功能室!?榻榻米+書桌榻榻米和書桌的組合,榻榻米鋪上,就能...
'Python全棧之路系列之元組數據類型'
"元組(tuple)和列表的唯一區別就是列表可以更改,元組不可以更改,其他功能與列表一樣創建元組的兩種方法第一種ages = (11, 22, 33, 44, 55)第二種ages = tuple((11, 22, 33, 44, 55))如果元祖內只有一個元素,那麼需要加...
Python
2019-09-09
'LeetCode算法第72題:編輯距離'
"問題描述:給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少操作數 。你可以對一個單詞進行如下三種操作:插入一個字符刪除一個字符替換一個字符示例 1:輸入: word1 = "horse", word2 = "ros"輸出: ...
'「BigBang」「分享」190831 權志龍和NIKE聯名鞋最新照片公開 最小40碼……'
"權志龍和NIKE聯名鞋最新照片公開,swag滿滿的設計+清新小花,想要get同款的女生VIP恐怕是有點難了,最小碼為40碼~(文/是它是它就是它 圖/bigbang地帶)"
' 同級最美,被山寨次數最多的雅馬哈踏板,155水冷引擎,漂亮運動'
"雖然踏板車被其車型定位所固定,但是並非所有的踏板車都中規中距的像小綿羊,而雅馬哈就生產過這樣一款車型,將跑車與踏板車元素融為一身的踏板車,雅馬哈 FORCE 155,相比一般的踏板車型來說,這輛踏板車可算是驚豔四方,吸引了很多年輕人的喜愛,可以說這是一款跨界非常成功的踏板...
推薦中...