我想写一个函数来计算(不设计)给定堆栈的最小值。我以为我可以在网上轻松找到,但我发现没有。我发现的所有内容都是如何使用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实现。但正如您所看到的,代码非常简单。我写这篇文章主要是因为我问自己很多问题。
特别是,我想问你三个主要问题:
由于
答案 0 :(得分:2)
正如你所解释的那样,时间和空间确实是O(n)。
您的方法中有逻辑。但是,您可以以允许您实现peek(int index)的方式实现Stack,(例如,如果您的堆栈基于数组。)然后您不必弹出重新插入所有元素。< / p>
您可以在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;
}