LeetCode破解之栈的序列

67 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}

最后

温馨提示:这道题目中多使用一个辅助栈来进行过程的模拟,帮助很大。非常建议通过辅助栈来处理中间过程。