LeetCode算法题155:最小栈解析

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) – 将元素 x 推入栈中。
  • pop() – 删除栈顶的元素。
  • top() – 获取栈顶元素。
  • getMin() – 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

这个题比较简单的想法就是利用两个栈,一个栈存所有的数据,另一个栈存到每个元素当前的最小值。然后还有一种思路就是一个栈存所有数据,而另一个栈只存不同的最小值,这样再pop的时候如果当前最小值等于栈顶元素,那么不仅存所有元素的栈要pop,最小值栈也要pop。还有一种思路就是只用一个栈,原理是一样的,如果最小元素更新,那么就存储之前的最小元素和当前值,然后更新最小元素,在pop时,如果当前元素等于最小元素,那么就要pop两次并更新最小元素。
C++源代码:

class MinStack {
private:
    stack<int> all;
    stack<int> min;
public:
    /** initialize your data structure here. */
    MinStack() {
        
    }
    
    void push(int x) {
        all.push(x);
        if (min.size()==0 || min.top()>x)
            min.push(x);
        else
            min.push(min.top());
    }
    
    void pop() {
        all.pop();
        min.pop();
    }
    
    int top() {
        return all.top();
    }
    
    int getMin() {
        return min.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

python3源代码:

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.l = []
        self.minNum = sys.maxsize

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if x <= self.minNum:
            self.l.append(self.minNum)
            self.minNum = x
        self.l.append(x)

    def pop(self):
        """
        :rtype: void
        """
        if self.l[-1] == self.minNum:
            self.l.pop()
            self.minNum=self.l[-1]
            self.l.pop()
        else:
            self.l.pop()

    def top(self):
        """
        :rtype: int
        """
        return self.l[-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.minNum


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

你可能感兴趣的:(Leetcode算法题分析)