1. 程式人生 > 實用技巧 >刷題記錄 leetcode155:最小值棧

刷題記錄 leetcode155:最小值棧

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

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

思路:用一個輔助棧的棧頂記錄原始棧的最小值,並且兩個棧的高度保持相同,入棧時,當前值與輔助棧的棧頂比較,將兩者的最小值入棧,這樣能保證,在原始棧的最小值彈出前,輔助棧一直儲存著最小值。

class MinStack {

    private Stack<Integer> dataStack;
    
private Stack<Integer> minStack; private int min; public MinStack() { dataStack = new Stack<>(); minStack = new Stack<>(); min = Integer.MAX_VALUE; } public void push(int x) { dataStack.add(x); min = Math.min(min, x); minStack.add(min); }
public void pop() { dataStack.pop(); minStack.pop(); min = minStack.isEmpty() ? Integer.MAX_VALUE : minStack.peek(); // 這句話是為了防止兩種情況:1. minStack彈出後棧為空,
min必須更新為最大整數,否則min會保持原來棧的最小值,產生錯誤。
2. 如果彈出後棧不為空,但是彈出的恰好是當前的最小值,
如果min不更新為棧頂元素(新棧的最小值),也會產生錯誤
} public int top() {
return dataStack.peek(); } public int getMin() { return minStack.peek(); } }