参加了 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 <= 10000 <= pushed[i] <= 1000pushed的所有元素 互不相同popped.length == pushed.lengthpopped是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;
};