AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 41. 包含min函数的栈    原题链接    简单

作者: 作者的头像   小呆呆 ,  2019-10-17 18:26:53 ,  阅读 418


2


算法1

1、在维护基础栈stack的同时还需要维护一个stackMin栈来记录stack栈的最小值
2、进栈push(int x)操作时,需要判断x与当前栈中最小值的大小,更新stack栈的最小值
3、出栈pop()操作时,需要stack栈的最小值

时间复杂度 $O(1)$

Java 代码

class MinStack {
    /** initialize your data structure here. */
    //历史最值
    private Stack<Integer> stack;
    private Stack<Integer> stackMin;//记录stack栈中从底到该位置的最小值
    public MinStack() {
        stack = new Stack<Integer>();
        stackMin = new Stack<Integer>();

    }

    public void push(int x) {
        //判断是不是第一个元素,若是第一个元素,则直接进站,否则进行比较
        if(stack.empty()) {stack.push(x);stackMin.push(x); return;}
        //比较stackMin最高位置和x的大小
        int min = stackMin.peek();
        if(min < x) {stack.push(x);stackMin.push(min);}
        else {stack.push(x);stackMin.push(x);}
    }

    public void pop() {
        stack.pop();
        stackMin.pop();
    }

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

    public int getMin() {
        return stackMin.peek();
    }

}

算法2

  • 1、此方法与方法一不一样,不需要维护一个最小值的单调栈stackMin,只需要将前面出现过的最小值埋在stack中

  • 2、进栈push(int x)操作时,需要判断x与最小值的大小
    若x <= min,则表示需要更新最小值,将当前最小值进栈push(min)保存前面的最小值,且更新最小值,再将元素进栈push(x) 注意:此处的栈顶元素是此时的栈顶元素也是栈的最小值
    若x > min,则直接将元素进栈push(x)

  • 3、出栈pop()操作时,需要判断min是否与栈顶元素相同
    若相同,说明该元素下方埋着前一个的最小值,需要将栈顶元素pop出,还需要将下一个栈顶元素(前一个最小值)pop出,并且赋值给min

时间复杂度 $O(1)$

Java 代码

class MinStack {

    /** initialize your data structure here. */
    private Stack<Integer> stack;
            private int min;
            public MinStack() {
                stack = new Stack();
                min = Integer.MAX_VALUE;
            }

            public void push(int x) {

                if (x <= min) {
                    stack.push(min);
                    min = x;
                }
                stack.push(x);
            }

            public void pop() {
                if (min == stack.peek()) {
                    stack.pop();
                    min = stack.pop();
                } else {
                    stack.pop();
                }
                if (stack.isEmpty()) {
                    min = Integer.MAX_VALUE;
                }
            }

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

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

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息