力扣155题,最小栈

力扣155题,最小栈

题目描述

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

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

输入输出样例

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.
解法一:不考虑时间复杂度,使用vector
class MinStack{
public:
    MinStack()
    {
        nums={};
    }

    void push(int val)
    {
        nums.push_back(val);
    }

    void pop()
    {
        nums.pop_back();
    }
    
    int top()
    {
        // cout<<*(nums.end()-1)<<endl;
        return *(nums.end()-1);
    }

    int getMin()
    {
        int length=nums.size();
        int minValue=nums[0];
        for(int i=0;i<length;i++)
        {
            minValue=min(minValue,nums[i]);
        }
        // cout<<minValue<<endl;
        return minValue;
    }
private:
    vector<int>nums;
};

解法二:使用辅助栈

//使用辅助栈,一个作为数据栈,一个作为最小栈
class  MinStack2{
private:
    stack<int>dataStk;
    stack<int>minStk;
public:
    MinStack2()
    {
        //最小栈先初始化入栈一个最大值
        minStk.push(INT_MAX);

    }

    void push(int val)
    {
        dataStk.push(val);
        minStk.push(min(minStk.top(),val));
    }

    void pop()
    {
        dataStk.pop();
        minStk.pop();
    }

    int top()
    {
        // cout<<dataStk.top()<<endl;
        return dataStk.top();
    }

    int getMin()
    {
    //     cout<<minStk.top()<<endl;
        return minStk.top();
    }
};

解法三,不使用辅助栈,并不使用额外空间,堆栈保存差值

//不适用额外空间
class MinStack3
{
private:
    int minValue=NULL;
    stack<long>dataStk;
public:
    MinStack3()
    {

    }

    void push(int val)
    {
        if(dataStk.empty())
        {
            dataStk.push(0L);
            minValue=val;
        }

        else
        {
            //数据栈中保存的是数字和最小值的差
            dataStk.push(long(val)-minValue);
            minValue=min(val,minValue);

        }
    }

//如果插值diff大于等于0,说明要出栈的值大于等于当前的min,则要出栈的值在入栈的时候没有更新min,返回min+diff
// 如果插值diff小于0,说明当前要出栈的值就是min(因为入栈的时候我们选择的就是min和入栈元素的最小值),同时,通过min-diff计算出之前min
//要注意的是diff可能会超出int范围,类似于 Integer.MAX_VALUE - 1 这种,所以diff要用Long存
    void pop()
    {
        long diff=dataStk.top();
        dataStk.pop();
        if(diff>=0)
        {

        }
        else
        {
            int res=minValue;
            minValue=minValue-diff;
        }
    }


    int top()
    {
        long diff=dataStk.top();
        if(diff>=0)
        {
            // cout<<minValue+diff<<endl;
            return minValue+diff;
        }
        else{
            // cout<<minValue<<endl;
            return minValue;
        }

    }

    int getMin()
    {
        // cout<<minValue<<endl;
        return minValue;
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值