Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目分析
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
思路讲解
按pushed的输入,按poped的输出
所有的元素一定是按顺序push进去的,重要的是思考怎么pop出来。
- 可以定义一个栈stack和一个遍历cur表示索引遍历
pushed的元素,将每一项push到栈中 - push之后,将栈中最新的元素与popped中对应索引的元素进行对比,如果一致则出栈,并修改索引
- 如果栈空了的话,说明按
pushed的输入,可以得到poped的结果
示例
输入: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
输入: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出: false
解释: 1 不能在 2 之前弹出。
代码
/*
* @lc app=leetcode.cn id=946 lang=javascript
*
* [946] 验证栈序列
*/
// @lc code=start
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
var validateStackSequences = function (pushed, popped) {
let cur = 0, stack = [];
for (item of pushed) {
stack.push(item)
while (stack[stack.length - 1] === popped[cur] && stack.length) {
// 如果stack中有值,并且最后一个元素与popped[cur]相等时,就从stack中出栈
stack.pop()
cur++ // 指针向后走一步,找到要输出的下一个数,再次进行对比
}
}
// 栈为空的话,说明pushed数组可以按popped形式输出
return !stack.length
};
// @lc code=end