LeetCode 155. 最小棧

題目描述

設(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.

思路

使用兩個棧 s1, s2,s1 正常的入棧出棧,s2 存放 s1 中所有節(jié)點的最小值。

  1. 入棧

    • 待入棧的值 x 不是最小值,s1 正常入棧,s2不操作
    • 待入棧的值 x 小于等于 s2 棧頂?shù)闹担f明有新的最小值,s1 正常入棧, 同時把 x 入到 s2 棧中,始終保持 s2 棧頂元素是最小值。
  2. 出棧

    • 出棧的值不是最小值,s1 正常出棧,s2 不操作
    • 出棧的值是最小值,s1 正常出棧,最小值要更新,所以 s2 也出棧
  3. 獲取最小值

    直接就是 s2 的棧頂元素。

#include<iostream>
#include<stack>
#include<string>
using namespace std;
class MinStack {
public:
    stack<int> s1, s2;
    MinStack() {
    }
    
    void push(int x) {
        s1.push(x);
        if(s2.empty() || x <= s2.top())
        {
            s2.push(x);
        }
    }
    
    void pop() {
        if(s1.top() == s2.top())
            s2.pop();
        s1.pop();
    }
    
    int top() {
        return s1.top();
    }
    
    int getMin() {
        return s2.top();
    }
};

最后編輯于
?著作權(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ù)。

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