持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
题目描述
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
双指针模拟栈空间
双指针模拟栈空间初步思路是:首先我最初的想法是找出路径顺序,此弹出为一个卡特兰序列,题目只需要判断是否满足条件即可,这种获取方案是能够拿到所有的路径方案,较为复杂;看过题解后,发现可以利用模拟栈进行判断,豁然开朗,瞬间明白template模板遍历过程中的标签判断也是此原理,故只需要判断栈是否为空即可。具体实现方式:
- 创建一个初始栈来处理,并初始化一个变量来记录出栈数量。
- 将pushed的元素push入栈,判断是不是栈顶元素,相同则出栈,对应的poped下标+1。每当栈顶元素与当前需要popped元素相同,pop。
- 若辅助栈stack为空,则true
- 若不为空,则依次检查栈顶元素与popped元素顺序是否一致
小tips:题目很简单,就看怎么做,选择合适的数据结构会方便很多。
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
int l = popped.length;
int left=-1,right=0;
for(int i : popped){
if(left >= 0 && i == pushed[left]){
left--;
continue;
}
if(right < l && i == pushed[right]){
right++;
continue;
}
while(right < l && i != pushed[right]){
pushed[++left] = pushed[right++];
}
if(right == l){
return false;
}
right++;
}
return true;
}
}
最后
温馨提示:这道题目中多使用一个辅助栈来进行过程的模拟,帮助很大。非常建议通过辅助栈来处理中间过程。