12 带最小值操作的栈

Posted 唐的糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12 带最小值操作的栈相关的知识,希望对你有一定的参考价值。

原题网址:https://www.lintcode.com/zh-cn/problem/min-stack/#

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持pushpop 和 min 操作,所有操作要求都在O(1)时间内完成。

 注意事项

如果堆栈中没有数字则不能进行min方法的调用

样例

如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

标签 
 
思路:可以创建两个数组,一个保存栈数据,另一个保存当前栈的最小值。栈数据数组不用说,入栈出栈直接操作即可。
最小值数组,新元素入栈时判断当前最小值(栈顶)与新元素哪个小,较小者压入最小值数组。元素出栈时,最小值数组删掉最后一个元素即可,两个数组始终等长。
min函数可以直接返回最小值数组最后一个元素,该值为当前栈最小值。
 
AC代码:
class MinStack {
public:
    MinStack() {
        // do intialization if necessary
    }

    /*
     * @param number: An integer
     * @return: nothing
     */
    void push(int number) {
        // write your code here
        m_iAarray.push_back(number);
        if (minVal.empty()||number<minVal.back())
        {
            minVal.push_back(number);
        }
        else
        {
            minVal.push_back(minVal.back());
        }
    }

    /*
     * @return: An integer
     */
    int pop() {
        // write your code here
        int temp;
        if (!m_iAarray.empty())
        {
            temp=m_iAarray.back();
            m_iAarray.pop_back();
        }
        if (!minVal.empty())
        {
            minVal.pop_back();
        }        
        return temp;
    }

    /*
     * @return: An integer
     */
    int min() {
        // write your code here
        return minVal.back();
    }
    
    vector<int> m_iAarray;
    vector<int> minVal;
};

参考:https://www.cnblogs.com/theskulls/p/5098271.html

 

另一种思路,用两个栈,一个保存数据,一个保存当前最小值,效率更高。参考:https://blog.csdn.net/ljlstart/article/details/48517703

这种方法当入栈时,判断新元素是否小于或等于当前最小值(最小值栈栈顶),小于等于则push新值更新最小值栈,否则维持原样。

删除元素时判断要删除的值是否是当前最小值,如果是,最小值栈删除当前栈顶,更新最小值。

 

 

 

 

以上是关于12 带最小值操作的栈的主要内容,如果未能解决你的问题,请参考以下文章

带最小值操作的栈 · Min Stack

算法题23 带min函数的栈

设计一个获取最小值时间复杂度为O的栈

包含min函数的栈

设计一个有getMin功能的栈

剑指offer:包含min函数的栈