[LeetCode] Min Stack

Min Stack

 

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.

解题思路:

主要是获得当前最小值的问题。我们可以用一个动态数组min存储当前最小值。若新压入的元素大于动态数组min最后一个元素,不做任何操作。否则(小于或等于)就压入min中。出栈的时候,若出栈元素等于min最后一个元素,则min数组出栈。这样便实现了常量时间找到栈中的最小值了。下面是代码:

class MinStack {
public:
    MinStack(){
        capcity=2;
        data = new int[capcity];
        size=0;
        
        minCapcity=2;
        min = new int[minCapcity];
        minSize = 0;
    }
    ~MinStack(){
        delete[] data;
        delete[] min;
    }
    void push(int x) {
        if(size>=capcity){
            int* p=data;
            capcity = 2*capcity;
            data=new int[capcity];
            std::memcpy(data, p, sizeof(int)*size);
            delete[] p;
        }
        data[size++]=x;
        
        if(minSize==0){
            min[minSize++]=x;
        }else if(min[minSize-1]>=x){
            if(minSize>=minCapcity){
                int* p=min;
                minCapcity = 2*minCapcity;
                min = new int[minCapcity];
                std::memcpy(min, p, sizeof(int)*minSize);
                delete[] p;
            }
            min[minSize++]=x;
        }
    }

    void pop() {
        if(size>0){
            size--;
            if(data[size]==min[minSize-1]){
                minSize--;
            }
        }else{
            throw exception();
        }
    }

    int top() {
        if(size>0){
            return data[size-1];
        }else{
            throw exception();
        }
    }

    int getMin() {
        return min[minSize-1];
    }
private:
    int size;
    int capcity;
    int* min;
    int minSize;
    int minCapcity;
    int* data;
};

二次刷题(2015-08-05)

同样的思路。注意min栈存储的是一个递减序列,栈顶是当前栈中最小的值。这样,每个操作其实都能够在常量时间完成。

class MinStack {
public:
    void push(int x) {
        ss.push(x);
        if(min.empty() || x<=min.top()){
            min.push(x);
        }
    }

    void pop() {
        int x = ss.top();
        ss.pop();
        if(x==min.top()){
            min.pop();
        }
    }

    int top() {
        return ss.top();
    }

    int getMin() {
        return min.top();
    }
private:
    stack<int> min;
    stack<int> ss;
};


转载请注明:康瑞部落 » [LeetCode] Min Stack

0 条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用 * 标注