LeetCode-E155-棧-最小棧

題目

設(shè)計一個支持 push,pop,top 操作,并能在常數(shù)時間內(nèi)檢索到最小元素的棧。

  • push(x) -- 將元素 x 推入棧中。
  • pop() -- 刪除棧頂?shù)脑亍?/li>
  • top() -- 獲取棧頂元素。
  • getMin() -- 檢索棧中的最小元素。

示例

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3
minStack.pop();
minStack.top(); --> 返回 0
minStack.getMin(); --> 返回 -2

思路

因為需要在常數(shù)時間內(nèi)完成,所以基本思想就是以空間換時間,因此使用輔助棧是常見的方法。使用輔助棧需要注意數(shù)據(jù)同步問題,當(dāng)輔助棧為空時,有新元素來就壓入。不為空時,普通棧壓入一個元素,需要與輔助棧的頂比較,如果小于等于就壓入。對于pop,每當(dāng)彈出時與輔助棧頂進(jìn)行比較,相同才彈出。

也可以不使用輔助棧,只使用一個棧,通過每次壓入兩個值(新值和最小值),出棧時彈出兩個值。對于top,用一個最小值變量保存彈出的最小值,取出頂部后再將其壓入。

解答

1.輔助棧

class MinStack {
public:
    stack<int> sta; //普通棧
    stack<int> min; //最小棧

    void push(int x) {
        sta.push(x);
        if(min.empty() || x <= min.top()) 
            min.push(x);
    }
    
    void pop() {
        if(min.top() == sta.top()) 
            min.pop();
        sta.pop();
    }
    
    int top() {
        return sta.top();
    }
    
    int getMin() {
        return min.top();
    }
};

【關(guān)注公眾號DoCode,每日一道LeetCode,將零碎時間利用起來】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容