劍指offer——包含min函式的棧

baixiaofei567發表於2020-12-26

在這裡插入圖片描述
因為要O(1)的時間複雜度,所以必須要輔助棧。這裡我們用兩個棧來實現。s1存放實際入棧元素,s2存放該層及以下最小的元素
push操作是靈魂,s1每次都要push,s2如果一開始為空,也要push。後面如果不為空了,就要進行判斷,push進來的值和棧頂的值哪個小,如果小於就push進來。反之再次push進棧頂的元素(方便pop)
pop就是兩個棧都進行pop,因為s2每一層存的都是s1對應層及以下最小的元素
top是取實際棧頂,返回s1.top
min返回s2.top

class Solution {
public:
    //棧的底層是隻能在一端操作的雙端佇列
    //直接用兩個stack來實現即可,因為min要o(1)的時復,所以必須要用輔助棧
    //pop為什麼不會影響取最小值得自己畫圖看看
    void push(int value) {
        stack1.push(value);
        if(stack2.empty()){
            stack2.push(value);
        }
        else if(stack2.top() >= value) {
            stack2.push(value);
        }
        else{
            stack2.push(stack2.top());
        }
    }
    void pop() {
        stack1.pop();
        stack2.pop();
    }
    int top() {
        return stack1.top();
    }
    int min() {
        return stack2.top();
    }
private:
    stack<int> stack1, stack2;
};

相關文章