155Min Stack

题目地址:155Min Stack

最近为了提高数据结构和算法能力,保证每天一到leetcode的题目。从easy开始,感觉这道题目还蛮好,记录一下。

题目大意:就是维护一个栈,获得栈中元素的的最小值。

首先想到,在栈里面设置一个min变量,当栈push一个数时,和min比较,如果比他大,min不变,比他小,min更新。但是这样,pop了min之后就没有了min的数据了……

也就是说,min这个数据,不只要维护当前的最小值,还要有之前的栈里面的数据信息。也就是说,min这个数据应该和栈同步增长数据和减少数据,这样自然想到min应该也是一个栈。而且这个栈的栈顶应该是整个栈的最小值,这样,才能取出来。于是,很自然的想到,minstack这个栈,在datastack进行push(x)操作的时候,minstack要取出他的栈顶元素(最小值min),和x进来的值进行比较,如果x>min,minstack就push(min),否则,push(x);

代码实现:

class MinStack {
public:
    stack<int> dataStack;
    stack<int> minStack;
    void push(int x) {
        dataStack.push(x);
        if(minStack.empty())
            {   
                minStack.push(x);
                return;
            }
            
        int min=minStack.top();
        if(min<x)
            {
                minStack.push(min);
                return;
            }
        minStack.push(x);
    }
    

    void pop() {
        dataStack.pop();
        minStack.pop();
    }

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

    int getMin() {
        return minStack.top();
    }
};


后来看了solution之后,官方给出了一种优化的办法,就是每次push(x)的时候,都比较min和x的大小,如果x>min,minstack不进行操作,否则,对于minstack进行push(x)的操作。这样相应的pop操作也要改变。每次pop的时候,都要检查pop出来的值x是否大于min,如果是,则minstack不进行操作,如果x==min,那么对minstack进行pop()操作。这样,对于minstack的存储空间有一定的降低。

代码如下:

class MinStack {
public:
    stack<int> dataStack;
    stack<int> minStack;
    void push(int x) {
        dataStack.push(x);
        if(minStack.empty())
            {   
                minStack.push(x);
                return;
            }
            
        int min=minStack.top();
        if(min>=x)
            {
                minStack.push(x);
                return;
            }
    }
    

    void pop() {
        int num=dataStack.top();
        int min=minStack.top();
        if(num==min){
            dataStack.pop();
            minStack.pop();
            return;
        }
        dataStack.pop();
    }

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

    int getMin() {
        return minStack.top();
    }
};




其实,想到过用最小堆的结构,维护一个最小堆,当栈进行push,最小堆就进行插入操作,这样的话push,top,getMin都可以比较好的做到,但是pop没办法。当栈进行pop操作的时候,最小堆没有办法删除对应的那个元素。(其实后来想了一下可以做到删除非栈顶元素,但是查找和删除的代价太大,特别是查找,应该要达到O(N)的时间复杂度了,而且删除非栈顶元素,失去了最小堆的特性了)


版权声明:本文为博主原创文章,未经博主允许不得转载。

 

posted @ 2015-05-27 15:34  fang92  阅读(496)  评论(0)    收藏  举报