[路飞]_leetcode946. 验证栈序列

137 阅读1分钟

题目描述

leetcode946. 验证栈序列

给定 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 之前弹出。

提示:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed 的所有元素 互不相同
  • popped.length == pushed.length
  • popped 是 pushed 的一个排列

JavaScript实现

/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
// 重点看出栈popped序列就可以
// 每次出栈的元素,要么是当前栈顶元素,要么是未来要入栈的元素
// 先看第一个出栈元素,要想出栈这个元素,那么一定要先入栈到这个元素
// 如示例1, 出栈元素4,那么一定要先入栈到4,然后才能出栈;[1,2,3,4];然后 栈顶4 出栈 => [1,2,3]
// 再看出栈元素5,看入栈序列栈顶是否是5,是就出栈,不是就先入栈再出栈, 先把元素5入栈=>[1,2,3,5]; 然后5出栈 =》[1,2,3]
var validateStackSequences = function(pushed, popped) {
    let arr = []; // 定义一个新序列辅助操作。不影响pushed序列
    // i 指向出栈序列的第i位, j 指向入栈序列的第j位
    for(let i = 0, j = 0; i < popped.length; i ++){
        // 如果arr的栈顶元素不等于要出栈的元素,就把原入栈序列的元素压入arr中
        // 边界条件处理:压入arr的元素不能超出入栈序列范围,初始arr = [], 先要把原入栈序列的元素压入
        while(j < pushed.length && (arr.length == 0 || arr[arr.length - 1] != popped[i])) {
            arr.push(pushed[j]);
            j ++;
        }
        // 如果找遍整个入栈序列都没有找到要出栈的元素,false
        if(arr[arr.length -1] != popped[i]) return false;
        // 如果找到了出栈元素,就直接pop
        arr.pop()
    }
    return true
};