LeetCode 每日一题——946a. 验证栈序列

1.题目描述

946. 验证栈序列

给定 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

示例 2:

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

2.解题思路与代码

2.1 解题思路

这道题使用一个栈便可以完成题目。首先我们构建一个栈 stack ,然后依次将 pushed 数组中的元素入栈,并且每次入栈以后比较 stack 栈顶元素与 poped 数组的第一个元素是否相同,如果不同继续将 pushed 数组元素入栈;如果相同,那么此时就需要弹出栈顶元素并且 poped 数组第一个元素后移(相当于 poped 数组也是一个栈并弹出栈顶元素),直到 stack 栈顶元素与 poped 数组当头位置数字不同,然后继续 pushed 元素入栈操作。以 pushed=[1,2,3,4,5],poped=[4,5,3,2,1] 为例,首先如下图构建一个栈 stack,以及指向 poped 头位置的索引 index,将 pushed 依次入栈。


当 pushed 的第三位也就是数字 4 入栈之后,此时栈顶元素为 4,与 poped 头位置也就是 index 所指位置上的数相同,此时弹出 stack 栈顶元素,并且 poped 头位置后移即 index 加一。


此时 stack 栈顶元素与 poped 头位置不同,那么继续让 pushed 元素入栈,直到将 pushed 最后一位入栈之后。

此时栈顶元素与 poped 头位置相同,那么弹出栈顶元素,并且index右移,重复这一操作,直到遇到栈顶元素与 index 所指元素不同或者栈空了为止。从下面图中可以看出,后面每一次弹出之后的栈顶元素正好与 index 位置上的元素相同,最后栈一直弹出直到栈空了为止。在遍历完 pushed 数组之后,最后判断栈是否为空,如果栈空了说明 poped 出栈顺序与 pushed 入栈能够匹配返回 true,反之不匹配返回 false。


2.2 代码

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        // 使用 int 数组和索引 sIdx  来模拟栈
        int[] stack = new int[pushed.length];
        int sIdx = -1;
        int index = 0;
        for (int i = 0; i < pushed.length; i++) {
            stack[++sIdx] = pushed[i];
            while (sIdx != -1 && popped[index] == stack[sIdx]) {
                sIdx--;
                index++;
            }
        }
        return sIdx == -1;
    }
}

2.3 测试结果

通过测试


测试结果

3.总结

  • 使用栈来进行解答,判断栈顶元素与 poped 头位置是否相同,相同则弹出栈顶,不同则继续让 pushed 元素入栈
  • 最后判断栈是否为空,为空则满足,不为空不满足

你可能感兴趣的:(LeetCode 每日一题——946a. 验证栈序列)