LeetCode 946 验证栈序列

105 阅读1分钟

参加了 kkb 的门徒培训,想要记录下自己的成长过程。每天一篇,坚持不断更 --- 2022.3.23

题目描述

给定 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 的一个排列

解题思路

利用栈,来记录未进行的操作,当 pushed 遍历完毕,还未操作完毕

/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
var validateStackSequences = function (pushed, popped) {
  // 利用栈储存未弹出栈
  let i = -1,
    j = 0;
  const stack = [];

  // 由于不想重复计算 stack.length 这里使用 i
  while (pushed.length || (i >= 0)) {
    // 弹出栈顶是否有符合数据
    if (i >= 0 && stack[i] === popped[j]) {
      // 有则通过
      j++;
      // stack 弹出栈顶元素
      stack.pop();
      i--;
    }
    // 不符合要求则需要 pushed 向下遍历
    else {
      // 当 pushed 无元素,说明已遍历完毕且不符合弹出要求
      if (!pushed.length) return false;
      stack.push(pushed.shift());
      i++;
    }
  }
  return true;
};