【劍指offer】包含min函數的棧

題目描述

定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。

注意:保證測試中不會當棧爲空的時候,對棧調用pop()或者min()或者top()方法。

思路

鏈接:https://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49?f=discussion
來源:牛客網

看到這個問題, 我們最開始可能會想, 添加一個成員變量用於保存最小元素, 每次壓棧時如果壓棧元素比當前最小元素更小, 就更新最小元素. 

    但是這樣會有一個問題, 如果最小元素被彈出了呢, 如何獲得下一個最小元素呢? 分析到這裏可以發現, 僅僅添加一個成員變量存放最小元素是不夠的, 我們需要在最小元素彈出後還能得到次小元素, 次小的彈出後, 還要能得到次次小的. 

    因此, 用另一個棧來保存這些元素是再合適不過的了. 我們叫它最小元素棧. 

    每次壓棧操作時, 如果壓棧元素比當前最小元素更小, 就把這個元素壓入最小元素棧, 原本的最小元素就成了次小元素. 同理, 彈棧時, 如果彈出的元素和最小元素棧的棧頂元素相等, 就把最小元素的棧頂彈出.

代碼

class Solution {
public:
    stack<int> s1,s2;
    void push(int value) {
        s2.push(value);
        if(s1.empty() || value <= s1.top()){
            s1.push(value);
        }
        
    }
    void pop(){
        if(s2.top() == s1.top()){
            s1.pop();
        }
        s2.pop();
    }
    int top() {
        return s2.top();
    }
    int min() {
        return s1.top();
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章