《剑指Offer》Java刷题 NO.20 包含min函数的栈

《剑指Offer》Java刷题 NO.20 包含min函数的栈(辅助栈空间)

时间:2020-02-28 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。


思路: 既然题目import了Stack,那就是说可以用咯~哈哈哈 因为要保证时间复杂度为O(1),那么只能在空间上做文章了,利用一个辅助栈B用来存当前栈的最小值

    压栈时,如果new>B的栈顶元素,A压栈,B不动;如果new<=B的栈顶元素,A压栈,B也压栈 出栈时,如果A的栈顶元素==B的栈顶元素,A出栈,B出栈,更新当前min值为B出栈之后的栈顶元素;否则,A出栈 一定要注意压栈时如果新元素==B的栈顶元素(也就是最小值)时,一定要压栈,相当于在计数(因为可能会出现多次间隔压入同一个最小值的现象),这样才能保证B的栈顶元素一直是最小值 另外还看到有人用两个ArrayList来代替Stack实现了想要的功能,就不做展示了

Java代码:

/**
 * 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
 * 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
 */
import java.util.Stack;
public class MyStack {
          
   
    Stack<Integer> stack=new Stack<>();
    Stack<Integer> minStack=new Stack<>();
    int min=Integer.MAX_VALUE;
    public void push(int node) {
          
   
        if(node<=min)
            minStack.push(node);
        min=minStack.peek();
        stack.push(node);
    }

    public void pop() {
          
   
        if(stack.peek()==minStack.peek())
            minStack.pop();
        stack.pop();
        min=minStack.peek();
    }

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

    public int min() {
          
   
        return min;
    }
}
经验分享 程序员 微信小程序 职场和发展