题目
算法思路
模拟入栈出栈操作的排列,如果根据输入的压入序列和弹出序列能够成功模拟对应的操作序列,则说明该弹出序列是有可能的。
算法流程:
1. 初始化: 辅助栈
s
t
k
stk
stk,弹出序列的索引
i
i
i
2. 遍历压入序列: 设当前数字为
n
u
m
num
num:
将
n
u
m
num
num 入栈;
循环出栈:若
s
t
k
stk
stk 栈顶元素与弹出序列的当前元素相等,则执行出栈,并将弹出序列的索引
i
i
i 加1
3. 返回值: 若最终
s
t
k
stk
stk 为空,则说明该弹出序列是合法的。
注意:用【 s t k stk stk 栈顶元素与弹出序列的当前元素相等】作为执行出栈操作的条件,是因为题设规定了栈内所有数字均不相等,这种情况下每个元素可出栈的位置是唯一的,如果有重复的数字的话,元素出栈的位置就会有多个。
具体代码
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stk = new Stack<>();
int i = 0;
for(int num : pushed){
stk.push(num);
while(!stk.isEmpty() && stk.peek() == popped[i]){
stk.pop();
i++;
}
}
return stk.isEmpty();
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),n 为压入序列的长度,因为每个元素最多入栈与出栈一次,所以最多一共有 2n 次出入栈操作
- 空间复杂度: O ( n ) O(n) O(n),n 为压入序列的长度,因为辅助栈 s t k stk stk 最多同时存储 n 个元素