刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

面试题

请描述您如何编写一个Java代码栈来实现Push、Pop操作以及获取当前栈中的最大值,同时确保这些操作的时间复杂度为O(1)?

使用微信搜索喵呜刷题,轻松应对面试!

答案:

解答思路:

要实现一个时间复杂度为O(1)的Java代码栈来执行Push、Pop以及Max操作,我们可以维护一个额外的变量来存储栈中的最大值。每次执行Push操作时,我们更新最大值;每次执行Pop操作时,我们检查是否需要更新最大值。这样,我们可以保证Max操作的时间复杂度为O(1)。

最优回答:

public class MaxStack {
    private Stack<Integer> stack; // 用于存储元素的栈
    private int maxStack; // 用于存储最大值的栈顶元素

    public MaxStack() {
        stack = new Stack<>();
        maxStack = Integer.MIN_VALUE; // 初始化为极小值
    }

    // Push操作:将元素压入栈,并更新最大值
    public void push(int val) {
        stack.push(val);
        if (val >= maxStack) {
            maxStack = val; // 更新最大值
        }
    }

    // Pop操作:弹出栈顶元素,并检查是否需要更新最大值
    public int pop() {
        if (stack.isEmpty()) {
            throw new RuntimeException("Stack is empty!"); // 如果栈为空则抛出异常
        }
        int val = stack.pop(); // 弹出栈顶元素
        if (val == maxStack) { // 如果弹出的元素是当前最大值,则需要更新最大值
            maxStack = findMax(); // 使用findMax辅助方法来找到新的最大值(因为栈可能不为空)
        }
        return val; // 返回弹出的元素值
    }

    // 获取当前栈的最大值(时间复杂度为O(1))
    public int max() {
        return maxStack; // 直接返回当前最大值,无需遍历栈,时间复杂度为O(1)
    }

    // 辅助方法:查找当前栈的最大值(不使用此方法的常规调用)
    private int findMax() {
        int maxVal = Integer.MIN_VALUE; // 初始化为极小值
        for (int val : stack) { // 遍历栈中的元素找到最大值
            if (val > maxVal) {
                maxVal = val; // 更新最大值
            }
        }
        return maxVal; // 返回当前栈的最大值
    }
}

解析:

在这个问题中,我们使用了额外的空间来存储当前的最大值,以此来保证Max操作的时间复杂度为O(1)。这种通过维护额外变量或数据结构来优化算法时间复杂度的思路在编程中非常常见。此外,Java中的Stack类是LIFO(后进先出)数据结构的一个实现,它提供了基本的Push和Pop操作。而这里的max操作则是基于Push和Pop操作进行优化的。同时,对于Java集合框架中的其他数据结构(如LinkedList、HashSet等),也可以采用类似的方法来优化某些操作的时间复杂度。
创作类型:
原创

本文链接:请描述您如何编写一个Java代码栈来实现Push、Pop操作以及获取当前栈中的最大值,同时确保这些操

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share