LeetCode 剑指offer Q30包含min函数的栈

思路

本题要模拟一个栈,实现出入栈,获取栈顶,获取当前最小值等函数。但是,后面来了一个要求,所有函数的时间复杂度要为o(1),push、pop、top函数使用函数都可以实现o(1)的复杂度,但是min函数一般情况下需要进行排序,所以基本是o(n),所以本题的难点在于怎样将min效率提高到o(1)。

方法很简单:使用双栈,初始化两个栈s1、s2,s1用来实现一般的出入操作,s2用来存储s1中各个元素对应的入栈时栈中的最小值,这样当s1无论是否有最小值弹出,都可以保持现在的最小值。

关键在于如何存储对应的最小值。我们可以在push操作中进行判断,若当前需要压入的元素x小于s2.top值,则压入x,否则将s2.top重复压入一遍。这样,每次进入一个元素,s2就对应地为它记录一个从它到栈底的元素中的最小值。

代码

class MinStack {

    /** initialize your data structure here. */
    Stack<Integer> s1,s2;
    public MinStack() {
    s1=new Stack<>();
    s2=new Stack<>();
    }

    public void push(int x) {
       s1.push(x);
       if(s2.isEmpty()||x<=s2.peek())
           s2.push(x);
           else s2.push(s2.peek());
    }

    public void pop() {
            s2.pop();
        s1.pop();
    }

    public int top() {
          return s1.peek();
    }

    public int min() {
       return s2.peek();
    }
}

/**
 * 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();
 */
发布了42 篇原创文章 · 获赞 0 · 访问量 2005

猜你喜欢

转载自blog.csdn.net/c630565685/article/details/104788144
今日推荐