剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例 1:
1 | 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] |
示例 2:
1 | 输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] |
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
是popped
的排列。
方法一:栈
我们可以模拟做类似题时的思路:如果栈顶数字不等于当前出栈数字,将入栈序列中的数字依次加入栈中,直到栈顶元素与当前出栈数字相等。
以示例 1 为例,idx1 指向压入序列,idx2 指向弹出序列。
- 栈为空,先将 1 压入栈中
- 栈顶数字 1 与数字 4 不相等,继续将 2 压入栈中
- 栈顶数字 2 与数字 4 不相等,继续将 3 压入栈中
- 栈顶数字 3 与数字 4 不相等,继续将 4 压入栈中
- 栈顶数字 4 与数字 4 相等,
- 栈顶数字 3 与数字 4 不相等,继续将 4 压入栈中
- 栈顶数字 5 与数字 5 相等,将 idx1 和 idx2 后移
- 数字 3 与栈顶数字 3 相等,idx2 后移,弹出栈顶元素
- 数字 2 与栈顶数字 2 相等,idx2 后移,弹出栈顶元素
- 数字 1 与栈顶数字 1 相等,idx2 后移,弹出栈顶元素
- 此时栈为空,代表第二个序列是第一个序列的弹出序列,返回 true。
如果出现栈顶元素与当前弹出数字不相同且 idx1 已经指向入栈序列末尾,返回 false。
下图可以辅助理解
1 | class Solution { |
- 时间复杂度O(n)
- 空间复杂度O(n)