[路飞]946. 验证栈序列

200 阅读1分钟

题目描述

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

分析

输入:Array, 两个数组用来判断 输出:Boolean,是否符合题目要求

解题思路

观察题目给我们的要求,我们实际上要验证的是 popped 这个数组里的每个元素,是否可以和 stack 中弹出的元素和之后等待 push 的元素相等。

因此对于 popped 中的每个元素,我们需要不断的检查上述的两个位置。

最终:

如果所有的 pushed 数组元素都被 push 进去了 stack, 说明验证已经完成。

接下来检查 stack.pop() 是否和当前考验的 popped 里的元素相等,如果不想等,那么就是 false

代码

/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
var validateStackSequences = function (pushed, popped) {
  const stack = []

  for (let i = 0, j = 0; i < popped.length; i++) {
    while (
      // 不断地检查 pushed stack 的值,看下一个 push 和 stack 顶部的元素是否和 popped 当前要验证的元素相等
      j < pushed.length &&
      (!stack.length || stack[stack.length - 1] !== popped[i])
    ) {
      stack.push(pushed[j])
      j++
    }

    if (stack[stack.length - 1] !== popped[i]) return false
    stack.pop()
  }

  return true
}

复杂度

空间:O(N), 用栈去存储元素 时间:O(N), 遍历 popped 里的元素