按升序排序堆棧的最佳方法是什麼? 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