力扣每日一题(946. 验证栈序列)

143 阅读2分钟

题目

给定 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 之前弹出。

这是一道标准的用栈(先进先出)来解决的问题,题目难度为中等,不过这道题目并不难,注意维护一个栈,如果这个栈最后被清空掉了,则输出true,否则输出false。那么怎么来维护这个栈呢?

  • 我们定义一个数组temp,一个指针j,一开始指向poped的第0个数据。
  • 遍历pushed,根据pushed的顺序把数字入栈。
  • 入栈后检查一下栈数据的最后一位数据n,是否和指针指的数字k一致,如果一致则把数据出栈,并把指针往后移动一位,直到n和k不一样为止。
  • pushed遍历结束后,如果temp中还有数据证明不可以按照题目的意思弹出数据,返回false,否则返回true。

上代码

function validateStackSequences(pushed: number[], popped: number[]): boolean {
    let temp: number[] = []
    let j = 0
    for (let i = 0; i < pushed.length; i++) {
        temp.push(pushed[i])
        while(temp.length && temp[temp.length - 1] === popped[j]) {
            temp.pop()
            j++
        }
    }
    return temp.length === 0
};

总结

  • 其实题目也表达的很明显了要用栈的方法解决问题,能想到的话解决起来并不困难。
  • 类似数据输入输出顺序来解决问题的,都可以尝试用队列/栈来解决问题,只要把队列/栈维护好,这类问题基本都挺好解决。