计算(不设计!)Java中堆栈的最小值

时间:2016-05-07 18:28:33

标签: java stack time-complexity

我想写一个函数来计算(不设计)给定堆栈的最小值。我以为我可以在网上轻松找到,但我发现没有。我发现的所有内容都是如何使用getMinimum函数设计堆栈。

不同之处在于,当您设计这样的堆栈时,您将逐步构建堆栈(推送和弹出)并在任何操作后更新最小值。我在想,如果你有一个给定的堆栈并且你想要计算这个堆栈的最小值,你怎么能处理它?也许,我不是很好地推理,或者我问自己错误的答案,或者我不太了解堆栈的概念,但是我没有找到任何答案让我感到惊讶关于网络中的内容,即使经过大量搜索......

这是我的尝试:

    public static int min(Stack stack){
        Stack temp = new Stack();
        int result = Integer.MAX_VALUE;
        while(!stack.isEmpty()) {
                int value = stack.pop();
                temp.push(value);
                result =  (result >= value)? value : result;
            }
    //stack is empty now, I have to recuperate it from the temp stack
             while(!temp.isEmpty()) {
                     stack.push(temp.pop());
             }

             return result;
      }

在这段代码中,我使用自己的Stack和Node实现。但正如您所看到的,代码非常简单。我写这篇文章主要是因为我问自己很多问题。

特别是,我想问你三个主要问题:

  • 这个功能的时间和空间复杂度是多少?我认为它是O(N),是不是?在我的程序中,我总是遇到一些困难。它通常是O(2 * N)(等于O(N)),因为我们通过每个节点的堆栈节点。
  • 我的方法是否符合逻辑?根据我的理解,如果你想要访问堆栈中的第k个元素,你必须弹出k-1前一个元素。或者在这里,在我看来,如果我们只是想要计算其最小值(如果你想再次操作同一个堆栈),则弹出整个堆栈绝对不合逻辑。这就是我进行第二次while循环以保持堆栈处于原始状态的原因。
  • 也许,我们可以制作一个堆栈的副本,​​但我读到Java中的克隆对象并不那么简单,我想知道这样的小函数是否会消耗它?

由于

4 个答案:

答案 0 :(得分:2)

  1. 正如你所解释的那样,时间和空间确实是O(n)。

  2. 您的方法中有逻辑。但是,您可以以允许您实现peek(int index)的方式实现Stack,(例如,如果您的堆栈基于数组。)然后您不必弹出重新插入所有元素。< / p>

  3. 您可以在Stack实现中保存其他已排序的数据结构,这将允许您获取O(1)中的最小值,但会将使用的空间加倍。最后,它总是在空间和时间之间进行权衡。

答案 1 :(得分:1)

在我看来,更好的选择是利用Vector能力,因为Stack是Java中Vector的子类

public static int min(Stack<Integer> stack) {
    Integer[] elements = stack.toArray(new Integer[1]);
    int min = Integer.MAX_VALUE;
    for(int i=0;i<elements.length;i++) {
        if(elements[i] < min) {
            min=elements[i];
        }
    }
    return min;
}

通过您自己实现的方法,这将为您提供更好的大输入数据性能。

希望这有帮助。

答案 2 :(得分:1)

Java中的Stack类继承自Vector。因此,您只需枚举项目而无需执行任何推送,弹出或复制操作。话虽如此,这是一个O(N)解决方案:

public static int min(Stack stack) {
    int m = Integer.MAX_VALUE;
    for (int i = 0; i < stack.size(); i++) {

        int current = stack.get(i).intValue();

        if (current < m)
        {
             m = current;
        }
    }
    return m;
}

答案 3 :(得分:0)

使用递归会更容易:

int min(Stack stack) {
    if(stack.isEmpty())
        return Integer.MAX_VALUE;

    int temp = stack.pop();
    int min = Math.min(temp, min(stack));
    stack.push(temp);

    return min;
}