题解 | #包含min函数的栈#

包含min函数的栈

https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49

class Solution {
public:
    void push(int value) {
        s1.push(value);
        //空或者新元素较小,则入栈
        if(s2.empty() || s2.top()>value)
            s2.push(value);
        else
            //重复加入栈顶
            s2.push(s2.top());
    }
    void pop() {
        //如果当前s1栈顶是最小元素,则s2栈顶也是最小元素,都要删除
        //如果当前s1栈顶不是最小元素,则s2栈顶是重复的最小元素,也要删除,使两个栈的大小保持一致,这样当s1长度为0时,s2也为0,便于对s2进行管理
        s1.pop();
        s2.pop();
    }
    int top() {
        return s1.top();
    }
    int min() {
        return s2.top();
    }
private:
    //用于栈的push 与 pop
    stack<int> s1;
    //用于存储最小min
    stack<int> s2;
};

思路:用另外一个栈来存储最小值

我们都知道栈结构的push、pop、top操作都是O(1),但是min函数做不到,于是想到在push的时候就将最小值记录下来,由于栈先进后出的特殊性,我们可以构造一个单调栈,保证栈内元素都是递增的,栈顶元素就是当前最小的元素。

具体做法:

  • step 1:使用一个栈记录进入栈的元素,正常进行push、pop、top操作。
  • step 2:使用另一个栈记录每次push进入的最小值。
  • step 3:每次push元素的时候与第二个栈的栈顶元素比较,若是较小,则进入第二个栈,若是较大,则第二个栈的栈顶元素再次入栈,因为即便加了一个元素,它依然是最小值。于是,每次访问最小值即访问第二个栈的栈顶。
全部评论

相关推荐

神哥不得了:首先我就是在成都,成都的互联网格外的卷,如果是凭现在的简历的话很难找到大厂,建议再添加一个高质量的项目上去,另外专业技能的话最好是超过每一条的一半
点赞 评论 收藏
分享
2024-12-29 19:48
河北科技大学 Java
我真的会练有氧:1.如果没有实习经验,项目一个太少了 2.项目的需求描述不要写成用xxx实现了xxx。写明具体的需求功能就可以,除非是你想特别突出让面试官问的问题 3.证书就一个4级没必要摆上去,摆上去显得你就只有一个4级 4.技术栈太少了,且比较简略,可以加点分布式,常用的微服务组件,架构设计等等信息 个人意见,不喜勿喷
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务