155. Min Stack - Medium
前往題目
想法
- 題目要求每個方法都要
O(1)
時間,如果用一般的stack
來做的話那push
,pop
,和top
都可以輕易做到。但是還有一個getMin
,他要回傳stack
中最小的數,如果只用一個int
來追蹤的話那萬一這個最小值被pop
了,就不知道下一個最小值是多少了,在哪裡都有可能。所以這裡應該需要一個PriorityQueue
來儲存 - 但是這樣又有一個問題,
pop
的時候中間值可能不見了,那就還要再花O(n)
時間在priorityQueue
裡面搜尋這個東西然後刪掉…
搬運一下前幾個月做這題的想法
- 這題普通,有想到,但沒實作
- 這題有個關鍵點是第二個
stack
,紀錄最小值的那個,每次有新的值要push
的時候都要檢查是否top element
比較小,是的話就再push
一次top element
。這是因為那個值會先被pop
掉,因為他比較大,而不會影響到getMin
,所以再push
一個,這樣pop
的時候就不會出現誤差了。Pop
的部分兩個stack
都是同時Pop
- 有個更好的解釋,直接畫兩個
stack
,你就可以看到兩個對應的層數就是pop
到該數時,該stack
的min
- 看不懂的話直接丟
debugger
看 - 簡單的
push -2 0 -
3就可以看出來 - 還有一個更省空間的解法,只需一個
stack
,算差值的
思路
- 兩個
stack
,一個紀錄最小值,一個就是主要的stack
- 每次
push
的時候,主要的stack
直接push
就好,最小值stack
看看最上層是否比新的值還要小,如果比較小再push
一個舊的值,否則新的值。這代表的是每個值所對應的最小值 - 其他就是直覺的操作
Code
155. Min Stack - Medium
https://f88083.github.io/2024/01/27/155-Min-Stack-Medium/