按升序排序堆栈的最佳方法是什么? I遇到了这个面试问题,我遇到了一些问题,以找到最好和最有效的解决方案。按升序排序堆栈?
有两种方法我可以想到。
为了弹出堆栈中的所有内容,并将它们存储在数组中,然后在
O(nLog n)
对数组进行排序,然后按内容备份堆栈。不是最好的方式....执行递归执行堆栈的排序它
void sort(stack)
{
type x;
if (!isEmpty(stack)) {
x = pop(stack);
sort(stack);
insert(x, stack);
}
}
void insert(x, stack)
{
type y;
if (!isEmpty(stack) && top(stack) < x) {
y = pop(stack);
insert(x, stack);
push(y, stack);
}
else {
push(x, stack);
}
}
但第二个方法看起来好像有太多的递归调用和开销如果堆栈碰巧很大,将会成为问题。
是否有可能以更好的方式解决这个问题,以获得最佳空间和时间复杂度?
有这么多的递归调用,(重叠的子问题),这是dynamic programming
类型的问题的竞争者?
什么是解决这个问题的最好方法? ?
为什么'O(n * log n)'排序时间次优?对于一般情况,这是已证实的限制。 –
你不能比'O(n)'空间和'O(n log n)'时间做得更好。弹出到数组中,排序和推送是最佳的。 – avakar
@avakar:得到第一个要求的证明(“不能做比'O(n)'空间好”)? – NPE