剑指 offer30 包含min函数的栈

237 阅读2分钟

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例:

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

提示:

  • 各函数的调用总次数不超过 20000 次

思路

普通栈的 push() 和 pop() 函数的复杂度为 O(1)O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N)O(N) 。 为了让min()函数的时间复杂度为O(1),我们需要维护一个辅助栈,栈顶来存放当前栈中的最小元素。

  • 数据栈:栈1,用于储存元素
  • 辅助栈:栈2,栈2的栈顶元素始终为栈1的的最小元素

有了以上两个栈,只需在入栈的元素与栈2 的元素比较一下,比栈顶元素小就存入栈2,反之则再存入一个栈顶元素进栈2。出栈的时候两栈栈顶元素一起出栈:top函数返回栈1的栈顶元素:min函数返回栈2的栈顶元素,也就是当前的最小元素

代码:

public:
    /** initialize your data structure here. */
    stack<int> s1,s2;//两个栈实现
    //每次将最小值入栈2
    MinStack() {
        s2.push(INT_MAX);//因为要将最小值入栈2,所以需要将其初始化为最大值。(第一个值不管怎样都有要入栈的)
    }
    
    void push(int x) {
        s1.push(x);
        if(x > s2.top())
            s2.push(s2.top());
        else
            s2.push(x);
        //当前最小值入栈
    }
    
    void pop() {
       s2.pop();
       s1.pop();//同时出栈就可以保持栈2中是最小值
    }
    
    int top() {
        return s1.top();
    }
    
    int min() {
        return s2.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->min();
 */
class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s1,s2;//两个栈实现
    //每次将最小值入栈2
    MinStack() {
        s2.push(INT_MAX);//因为要将最小值入栈2,所以需要将其初始化为最大值。(第一个值不管怎样都有要入栈的)
    }
    
    void push(int x) {
        s1.push(x);
        if(x > s2.top())
            s2.push(s2.top());
        else
            s2.push(x);
        //当前最小值入栈
    }
    
    void pop() {
       s2.pop();
       s1.pop();//同时出栈就可以保持栈2中是最小值
    }
    
    int top() {
        return s1.top();
    }
    
    int min() {
        return s2.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->min();
 */