美文网首页程序员
LeetCode:最小栈

LeetCode:最小栈

作者: 李海游 | 来源:发表于2020-05-02 17:02 被阅读0次

155. 最小栈

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

一、队列实现

思路:栈中每push# 155. 最小栈

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

一、队列实现

思路:
push:vector存储 栈顶为当前栈顶元素 的最小元素,每次push进栈,vector也随之更新,如果新元素小于vector末尾元素,则vector存入新元素,否则存入原末尾元素。
pop:vector弹出末尾元素,栈弹出栈顶元素
top:返回栈顶元素
getMin:返回vector末尾元素

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s;;
    vector<int> v;
    MinStack() {

    }
    
    void push(int x) {
        s.push(x);
        int tmp;
        if(v.empty())  //栈为空时push,此时vecrot也为空
            tmp=x;    
        else
            tmp=v[v.size()-1]<x?v[v.size()-1]:x;  //
        v.push_back(tmp);
    }
    
    void pop() {
        s.pop();
        v.pop_back();
    }
    
    int top() {
        return s.top();
    }
    
    int min() {
        return v[v.size()-1];
    }
};

两个栈实现

思路:栈s1是基础栈。栈s2是辅助栈,存储最小最小值,当push新值时,如果新值小于等于s2栈顶的值,则新值也push到s2。
当pop时,比较s1栈顶值和s2栈顶值是否相等,若相等,说明此时最小值时由s1栈顶值,s1弹出时,s2也要弹出。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s1,s2;
    MinStack() {
  
    }
    
    void push(int x) {
        s1.push(x);
        if(s2.empty())  
        {
            s2.push(x);
        }
        else
        {
            int tmp=s2.top();
            if(x<=tmp)
                s2.push(x);
        }     
    }
    
    void pop() {
        int tmp=s1.top();
        if(tmp==s2.top())  
            s2.pop();
        s1.pop();
    }
    
    int top() {
        return s1.top();
    }
    
    int getMin() {
        return s2.top();
    }
};

一个栈实现

思路:入栈时,比较最小值和当前值,更新最小值,然后当前值入栈,最小值也入栈,这样栈顶是最小值,栈顶下一元素是之前push进的值。
pop时pop两次。top时前弹出并记录栈顶也就是最小值,这时的栈顶是上次压入的值,也就是真的top,然后再把弹出的最小值压入栈中。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s;

    MinStack() {

    }
    
    void push(int x) {
        if(s.empty())
        {
            s.push(x);
            s.push(x);
        }
        else
        {
            int m_min=s.top();
            m_min= x<=m_min?x:m_min;
            s.push(x);
            s.push(m_min);
        }
            
    }
    
    void pop() {
        s.pop();
        s.pop();
    }
    
    int top() {
        int tmp=s.top();
        s.pop();
        int res=s.top();
        s.push(tmp);
        return res;
    }
    
    int getMin() {
        return s.top();
    }
};

相关文章

  • LeetCode-155-最小栈

    LeetCode-155-最小栈 155. 最小栈[https://leetcode-cn.com/problem...

  • 栈复盘

    Day1 :最小栈 https://leetcode-cn.com/problems/min-stack/ 线性栈...

  • LeetCode:最小栈

    155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(...

  • LeetCode—— 最小栈

    题目描述 一、CPP 1. 双栈法: 解题思路:投机取巧,使用两个栈,一个栈满足所有的要求。另一个辅助栈用来保存栈...

  • 2019-02-01 Day 27

    1.最小栈来源LeetCode 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。...

  • LeetCode 155. 最小栈 | Python

    155. 最小栈 题目来源:https://leetcode-cn.com/problems/min-stack ...

  • LeetCode:155. 最小栈

    问题链接 155. 最小栈[https://leetcode-cn.com/problems/min-stack/...

  • 最小栈(LeetCode 155)

    题目: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 示例: 方法: 使用一...

  • Swift 最小栈 - LeetCode

    题目: 最小栈 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x...

  • 2.栈(二)

    题目汇总:https://leetcode-cn.com/tag/stack/155. 最小栈简单[✔]173. ...

网友评论

    本文标题:LeetCode:最小栈

    本文链接:https://www.haomeiwen.com/subject/dxthghtx.html