码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode]Min Stack

时间:2015-02-09 14:13:19      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.

这是题考查的是栈的基本功能:入栈、出栈、获取栈顶元素,外加一个取栈中最小元素。
正常情况下,入栈、出栈、获取栈顶元素这三个操作都是O(1)的时间复杂度,主要问题就是getMin()了。如果按照一般遍历的做法找最小值,那么getMin()的时间复杂度就是O(n)了。
比较容易想到的就是在push的时候维护该最小值了。如何维护呢?可以想到的是,如果栈顶元素是最小值,那么pop出去的话,如何获得剩余元素的最小值呢?如果要去寻找的话就又是O(n)了。
解决方案就是再维护一个栈——最小栈。最小栈的栈顶元素永远等于目前原始栈中的最小值。
对原始栈进行push操作时,如果当前元素不大于最小栈的栈顶元素时,则同时入原始栈和最小栈;否则只入原始栈。
对原始栈进行pop操作时,如果栈顶元素等于最小栈的栈顶元素,那么两个栈同时取出栈顶元素,否则只取出原始栈的栈顶元素。
这个解决方案的空间复杂度是O(n)。
下面贴上代码:

class MinStack {
private:
    stack<int> S;
    stack<int>minS;
public:
    void push(int x) {
        S.push(x);
        if (minS.empty() || minS.top() >= x){
            minS.push(x);
        }
    }

    void pop() {
        if (S.empty())
            return;
        int num = S.top();
        S.pop();
        if (!minS.empty() && minS.top() == num){
            minS.pop();
        }
    }

    int top() {
        if (S.empty())
            exit(1);
        return S.top();
    }

    int getMin() {
        if (minS.empty())
            exit(1);
        return minS.top();
    }
};

[LeetCode]Min Stack

标签:

原文地址:http://blog.csdn.net/kaitankedemao/article/details/43669619

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!