LeeCode_155. 最小栈(辅助栈)

本文介绍了如何设计一个支持push、pop、top和getMin操作,并能在常数时间内检索到最小元素的栈。通过维护一个辅助栈来记录最小值,实现了在O(1)时间复杂度内获取最小元素。两种实现方式分别是记录最小值和垫入最大值,确保了栈操作的高效性。
摘要由CSDN通过智能技术生成

一、介绍

1.题目描述

题目链接:https://leetcode-cn.com/problems/min-stack/

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

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

2.测试样例

["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
# [null,null,null,null,-3,null,0,-2]

["MinStack","push","push","push","top","pop","getMin","pop","getMin","pop","push","top","getMin","push","top","getMin","pop","getMin"]
[[],[2147483646],[2147483646],[2147483647],[],[],[],[],[],[],[2147483647],[],[],[-2147483648],[],[],[],[]]
# [null,null,null,null,2147483647,null,2147483646,null,2147483646,null,null,2147483647,2147483647,null,-2147483648,-2147483648,null,2147483647]

["MinStack","push","push","getMin","getMin","push","getMin","getMin","top","getMin","pop","push","push","getMin","push","pop","top","getMin","pop"]
[[],[-10],[14],[],[],[-20],[],[],[],[],[],[10],[-7],[],[-7],[],[],[],[]]
# [null,null,null,-10,-10,null,-20,-20,-20,-20,null,null,null,-10,null,null,-7,-10,null]

二、题解(辅助栈)

我们定义一个栈 stk 用于正常的入栈出栈,再定义一个辅助栈 stk_min 存储当前已入栈元素中的最小值。
参考链接:https://leetcode-cn.com/problems/min-stack/solution/zui-xiao-zhan-by-leetcode-solution/

1、记录最小值 t🟡

要实现这一功能,我们可以在让两个栈同时出入元素, stk 正常出入,而stk_min需要进行判断后入栈,判断当前最小的元素为多少。

先定义一个t,取int最大值,当新元素入栈,判断是否更小,更小则更新t。

对于插入:

  • 当栈为空,t为下一个入栈的元素
  • 当栈不为空,t为当前最小值

对于弹出:

  • 若栈不为空,t更新为stk_min栈顶
class MinStack {
    stack<int> stk,stk_min;
    int t=INT_MAX;
public:
    MinStack() {}
    void push(int val) {
        // 栈为空,t为下一个入栈元素
        if(stk.empty()) t=val;
        // 栈不为空,经判断后更新t
        if(val<t)t=val;
        stk.push(val);
        stk_min.push(t);
    }

    void pop() {
        // 同时弹出
        stk.pop();
        stk_min.pop();
        // 弹出后若栈不为空,t更新为当前stk_min的栈顶,即当前最小值
        if(!stk_min.empty()) t=stk_min.top();
    }

    int top() {
        // stk栈顶
        return stk.top();
    }

    int getMin() {
        // 最小值为stk_min栈顶
        return stk_min.top();
    }
};

image-20210915163731840

2、垫入最大值🔴

对第一种代码进行改进,先在stk_min中垫一个int最大值,保证stk_min不为空。

之后与第一种代码类似,同进同出,只是在插入时在stk_min中插入min(stk_min栈顶,val),这样弹出时也不用对最小值进行更新

class MinStack {
    stack<int> stk,stk_min;
public:
    MinStack() {
        // 在 stk_min中垫最大值,防止stk_min为空
        stk_min.push(INT_MAX);
    }
    void push(int val) {
        stk.push(val);
        // 插入min(stk_min栈顶,val)
        stk_min.push(min(stk_min.top(),val));
    }

    void pop() {
        stk.pop();
        stk_min.pop();
    }

    int top() {
        return stk.top();
    }

    int getMin() {
        return stk_min.top();
    }
};

image-20210915165756191

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值