其他分享
首页 > 其他分享> > 20.包含min函数的栈

20.包含min函数的栈

作者:互联网

包含min函数的栈

题目链接

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。

辅助栈

从之前两个栈实现队列,到实现带有min栈的功能。我发现了一个特点,想在栈的基础上增加或者改变功能,我们可以从增加一个辅助栈入手。

题目要求时间复杂度O(1)min算法,并不能暴力的保留栈每次push或pop操作之后的min值。

我们设立一个主栈s1,辅助栈s2。我们定义辅助栈保留我们所需要的最小值序列,保证辅助栈的top值总是栈push或者pop操作情况下的min值。

push

首先将value放入主栈

这样在一系列push操作后,主栈包含所有push元素,辅助栈会存有从过程中的最小值序列。

例如push(4,3,5,2,7,1) 主栈(4,3,5,2,7,1) 辅助栈(4,3,2,1)

pop

我们保证了辅助栈的top值是任意过程的min值。在pop之前

例如 主栈(4,3,5,2,7,1) 辅助栈(4,3,2,1)

  1. pop第一次,主栈(4,3,5,2,7,1) 辅助栈(4,3,2)
  2. pop第二次,主栈(4,3,5,2) 辅助栈(4,3,2)

top

在push和pop操作我们为带有min栈实现了基础,top操作可直接返回主栈的top值

min

min操作直接返回当前情况的min值也就是辅助栈的top元素。从而实现了min算法时间复杂度O(1)。

class Solution {
    stack<int> s1, s2;
public:
    void push(int value) {
        s1.push(value);
        if (s2.empty())
        {
            s2.push(value);
        }
        else if (value < s2.top())
        {
            s2.push(value);
        }
    }
    void pop() {
        if (s1.top() == s2.top())
        {
            s1.pop();
            s2.pop();
        }
        else
        {
            s1.pop();
        }
    }
    int top() {
        return s1.top();
    }
    int min() {
        return s2.top();
    }
};
RyanBraynt 发布了78 篇原创文章 · 获赞 28 · 访问量 3万+ 私信 关注

标签:辅助,函数,min,top,pop,push,20,主栈
来源: https://blog.csdn.net/WxqHUT/article/details/104514513