棧 | 最小棧

題目:最小棧

題目鏈接
在這裏插入圖片描述

解題思路

設進行操作的棧爲s1,如果沒有取得棧中最小值的操作,可以很輕鬆解決問題,問題的難點就在於如何在常數時間裏找到棧中的最小值,爲了實現這一目標我們再開一個棧s2,將棧s2維護爲一個單調遞減的棧,棧頂元素最小。

  • 入棧操作:直接將x壓入s1,當x小於等於棧s2的棧頂元素時,將x也壓入s2中,這是因爲這時棧中的最小元素變爲x了,當x大於棧s2的棧頂元素時,不用將x壓入棧s2,因爲現在棧s1中的最小元素依然是原s2的棧頂元素
  • 出棧操作:s1直接進行出棧操作,設出棧元素爲top,當top等於s2的棧頂元素時,s2進行出棧操作,這時因爲s1中的最小值已經出棧了,所以s2也要進行出棧,當top大於s2的棧頂元素時,不用出棧,因爲s1中的最小元素還沒有出棧,此時s1中的最小元素依然是s2的棧頂元素

C++代碼

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {
    }
    
    void push(int x) {
        s1.push(x);//s1直接壓棧
        if(s2.empty() || x <= s2.top()) s2.push(x);//s2爲空,或者x小於等於棧頂元素時壓棧
    }
    
    void pop() {
        if(s1.empty()) return;
        if(s2.top() == s1.top()) s2.pop();//如果出棧元素是最小值時,s2也出棧
        s1.pop();//s1直接出棧
    }
    
    int top() {
        if(s1.empty()) return 0;
        return s1.top();
    }
    
    int getMin() {
        if(s2.empty()) return 0;
        return s2.top();//s2的棧頂元素即爲棧s1中的最小值
    }
    private:
        stack<int>s1;//操作的棧
        stack<int>s2;//單調遞減棧,棧頂元素最小,用於在常數時間裏找到最小值
};

/**
 * 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();
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章