1. 程式人生 > 實用技巧 >LeetCode155. 最小棧

LeetCode155. 最小棧

要能夠在常數時間內檢索到棧內最小元素,我們可以額外開一個棧,這個額外的棧的棧頂元素存放目前棧內的最小元素,每次棧內壓入一個新元素,輔助棧也壓入一個元素,也就是把新元素和原棧頂元素比較,較小的那個就是新的最小元素,壓入輔助棧的棧頂;原棧彈出棧頂元素的時候,輔助棧也彈出棧頂元素,這樣,不管什麼時候,輔助棧的棧頂元素總是存放原棧當前的棧內最小元素。

題目說了,push、pop和getMin操作總是在非空棧上呼叫,所以不需要做特判。

不過,由於輔助棧每次壓入的元素都是新元素和原棧頂元素的最小值,這樣,當壓入第一個元素的時候,就是新元素和一個空棧頂進行比較,這是不行的,所以我們初始化在輔助棧minSt裡壓入一個INT_MAX,這樣輔助棧第一個元素就是原棧的第一個元素和INT_MAX之間的較小值(還是第一個元素),這樣就把邊界情況處理了。

程式碼如下:

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> st, minSt;
    MinStack() {
        minSt.push(INT_MAX);
    }
    
    void push(int x) {
        st.push(x);
        minSt.push(min(x, minSt.top()));
    }
    
    void pop() {
        st.pop();
        minSt.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return minSt.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */