面试题 03.05. 栈排序
题目描述
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push
、pop
、peek
和 isEmpty
。当栈为空时,peek
返回 -1。
示例1:
输入: ["SortedStack", "push", "push", "peek", "pop", "peek"] [[], [1], [2], [], [], []] 输出: [null,null,null,1,null,2]
示例2:
输入: ["SortedStack", "pop", "pop", "push", "pop", "isEmpty"] [[], [], [], [1], [], []] 输出: [null,null,null,null,null,true]
说明:
- 栈中的元素数目在[0, 5000]范围内。
解法
方法一:栈 + 辅助栈
我们定义一个栈 \(stk\),用于存放元素。
在 push
操作中,我们定义一个辅助栈 \(t\),用于存放 \(stk\) 中比当前元素小的元素。我们将 \(stk\) 中比当前元素小的元素全部弹出并存放到 \(t\) 中,然后将当前元素压入 \(stk\),最后将 \(t\) 中的元素全部弹出并压入 \(stk\)。时间复杂度 \(O(n)\)。
在 pop
操作中,我们只需要判断 \(stk\) 是否为空,如果不为空,则弹出栈顶元素。时间复杂度 \(O(1)\)。
在 peek
操作中,我们只需要判断 \(stk\) 是否为空,如果为空则返回 -1,否则返回栈顶元素。时间复杂度 \(O(1)\)。
在 isEmpty
操作中,我们只需要判断 \(stk\) 是否为空。时间复杂度 \(O(1)\)。
空间复杂度 \(O(n)\),其中 \(n\) 为栈中元素的个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|