Java教程

腾讯五十题 No.34

本文主要是介绍腾讯五十题 No.34,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

这道题评论区的大佬真是各抒己见啊,我也不知道用栈来实现对不对,但是看到一个非常棒的用栈来实现的方法

class MinStack {
    private int min = Integer.MAX_VALUE;
    private Stack<Integer> stack;

    public MinStack() {
        stack = new Stack<>();
    }
    
    public void push(int val) {
        //用一个变量来存最小值,如果存储的这个最小值比入栈元素大,就把原来的最小值入栈,再把当前元素的值存到min里
        if(min >= val){
            stack.push(min);
            min = val;
        }
        //当前元素入栈
        stack.push(val);
    }
    
    public void pop() {
        if(stack.pop() == min){
            min = stack.pop();
        }
    }
    
    public int top() {
        return stack.peek();
    }
    
    //直接返回min中的最小元素的值
    public int getMin() {
        return min;
    }
}

再来看看官方的栈

class MinStack {
    Deque<Integer> xStack;
    Deque<Integer> minStack;

    public MinStack() {
        xStack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE);
    }
    
    public void push(int x) {
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x));
    }
    
    public void pop() {
        xStack.pop();
        minStack.pop();
    }
    
    public int top() {
        return xStack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

上面的方法都会用到额外空间,来看看不用额外空间的吧

class MinStack {

    // 数组栈, [当前值, 当前最小值]
    private Stack<int[]> stack = new Stack<>();

    public MinStack() {

    }

    public void push(int x) {
        if (stack.isEmpty()){
            stack.push(new int[]{x, x});
        }else {
            stack.push(new int[]{x, Math.min(x, stack.peek()[1])});
        }
    }

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

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

    public int getMin() {
        return stack.peek()[1];
    }
}

啊好难啊啊啊啊啊

这篇关于腾讯五十题 No.34的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!