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
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public void push(int val) {
stack.push(val);
if (minStack.empty()) {
minStack.push(val);
} else {
minStack.push(Math.min(val, minStack.peek()));
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}155. Min Stack - Medium
https://f88083.github.io/2024/01/27/155-Min-Stack-Medium/