面试题 03.02. 栈的最小值

面试题 03.02. 栈的最小值
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

  • 示例:

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

解法一:
使用两个栈,一个栈s存储所有入栈的元素,另一个栈m用来存储最小值。

  • 当进行push操作时候,先判断当前要入栈的元素x是否比最小栈栈顶的元素要小,如果是的话,将元素x压入栈s的同时将x也压入最小栈m。
  • 当进行pop操作时候,判断s栈顶元素和m栈顶元素是否相同,如果相同的话,将s和m的栈顶元素都pop,否则的话,只将s的栈顶元素pop。
  • 当进行getMin操作时候,直接返回m栈顶的元素。
class MinStack {
public:
    /** initialize your data structure here. */
   stack<int> s;
   stack<int> m;
    MinStack() {
        
    }
    
    void push(int x) {
        s.push(x);
        if(m.empty() || x <= m.top())
            m.push(x);
    }
    
    void pop() {
        if(s.top() == m.top())
            m.pop();
        s.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int getMin() {
        return m.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();
 */

解法二:
类似于解法一的思想,但是不另外开辟新的栈,而是用变量min存储栈中的最小值。

  • 当进行push操作的时候,如果要push的元素x比min还要小,那么就先将min压入栈中,再将x压入栈中,同时更新栈的最小值min。
  • 当进行pop操作的时候,如果栈顶元素的值等于min,那么将栈顶元素pop掉,同时将栈顶元素的下一个元素赋值给min,然后再将它pop掉。
  • 当进行geiMin操作的时候,直接返回min。
class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s;
    int MIN = INT_MAX;
    MinStack() {

    }
    
    void push(int x) {
        if(x <= MIN)
        {
            s.push(MIN);
            MIN = x;
        }
        s.push(x);
    }
    
    void pop() {
        if(MIN == s.top())
        {
            s.pop();
            MIN = s.top();
        }
        s.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int getMin() {
        return MIN;
    }
};

/**
 * 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();
 */

你可能感兴趣的:(《程序员面试金典》专栏,LeetCode)