题目描述
给定 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 里的元素