[路飞] 26——leetcode - [946] 验证栈序列

110 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

946. 验证栈序列

题目分析

给定 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