剑指offer系列——剑指 Offer 30. 包含min函数的栈

✨剑指 Offer 30. 包含min函数的栈✨

🌈大家好!本篇文章将继续介绍关于栈队列堆的OJ题,题目来自力扣:剑指 Offer 30. 包含min函数的栈,展示代码语言暂时为:C++代码 😇。

今天继续力扣C++打卡(12.09)!✊✊✊

🔒1、题目:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
🌲 示例 🌲:

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

❗️ 提示 ❗️ :

各函数的调用总次数不超过 20000 次

来源:力扣(LeetCode)👈

链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/description/?orderBy=most_votes

☀️2、思路:

题目要求实现一个能够得到栈的最小元素的 min 函数。
我们首先应了解,栈是后入先出,其只有一个出口。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。
故只要顶端元素存入后,栈里面的元素内容不会发生改变,故可以考虑在每想向栈中存放一个元素时,存入上一次的最小值和本次加入的元素。
其中上一次的最小值可以方便pop时,得到pop该值后的最小值。

实现流程:
1️⃣ 定义一个无穷大的数为最小值Min,创建一个stack容器s;
2️⃣ push某一元素时,先加入上一个最小值Min,然后通过if语句对Min进行更新,之后加入该元素;
3️⃣ pop时,先pop掉该元素,然后把Min更新为上一个最小值,之后pop该最小值;
4️⃣ top直接返回顶端元素即可,min返回存放的最小值Min。

复杂度分析:
⏳时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。
🏠空间复杂度 O(N) :其中 n 为总操作数。最坏情况下,我们会连续插入 n 个元素,此时栈占用的空间为 O(n)。

🔑3、代码:

class MinStack {
public:
    int Min=INT_MAX; //定义一个无穷大的数
    stack <int> s;
    MinStack() {       
    }
    
    void push(int x) {
        s.push(Min);  //加入上一个最小值  方便pop时,直接得到去掉该元素后的最小值
        if(x<Min) Min=x; //更新最小值
        s.push(x);  //加入该元素
    }
    
    void pop() {
        s.pop();    //pop掉该元素
        Min=s.top();// Min 为上一个最小值
        s.pop();    // 将该最小值也pop掉
    }
    
    int top() {
        return s.top();
    }
    
    int min() {
        return Min;
    }
};

再提供一下官方的解法,采用了两个栈来完成题目,一个栈用来存放数据,另一个栈用来存放每个元素对应的最小值。与本文类似,但实现上有所差别。代码如下:

class MinStack {
    stack<int> x_stack;
    stack<int> min_stack;
public:
    MinStack() {
        min_stack.push(INT_MAX);
    }
    
    void push(int x) {
        x_stack.push(x);
        min_stack.push(::min(min_stack.top(), x));
    }
    
    void pop() {
        x_stack.pop();
        min_stack.pop();
    }
    
    int top() {
        return x_stack.top();
    }
    
    int min() {
        return min_stack.top();
    }
};

作者:力扣官方题解
来源:力扣(LeetCode)👈
链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/solutions/1398785/bao-han-minhan-shu-de-zhan-by-leetcode-s-i2fk/

🐾4、总结

🌈重点要清楚顶端元素存入后,栈里面的元素内容不会发生改变,故可以考虑在每想存放一个元素时,存入上一次的最小值和本次加入的元素。**其中上一次的最小值可以方便pop时,得到pop该值后的最小值。**这样就能较容易地完成本题.

🕊小伙伴们,明天俺要去考六级了,希望一次过🙏🙏。明天争取晚上更,当然也有可能断更🙄🕊
🚀🚀觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦🙏 🙏🙌 !

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君莫笑lucky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值