[路飞]_一起刷leetcode 946. 验证栈序列

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

946. 验证栈序列

给定 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 <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed 的所有元素 互不相同
  • popped.length == pushed.length
  • popped 是 pushed 的一个排列

思路

  1. 先读一下题,这道题目看起来有点绕,实际上想表达的是从左边待pushed的数组中,每轮push一个元素进去,同时,看心情拿出来,每轮可以拿任意个也可以不拿,有没有办法返回右边的数据结构;意思就是说,左边的pushed代表男嘉宾,每次出来一个,如果能被心动女生选中,他们就牵手成功下台,不然的话就放在待选区(stack),等待女生挑选,待选区每次排好队了,只能看到最后一个男嘉宾。女嘉宾也是如此,只能看到最前面那个,当最前面那个牵手成功后,这时候第二位女嘉宾,和倒数第二位男嘉宾就有机会对上眼神了,如果确认过颜色是对的人那么就再次牵手成功一对,一直到没有男嘉宾或者女嘉宾为止;
  2. 那么我们只需要经过一轮遍历,用stack记录未匹配上的男嘉宾,每次男嘉宾上台就pushstack中,同时匹配一下当前男嘉宾(数组的最后一位)和心动女生(待返回列表的第一位)是否匹配即可;
  3. 如果不匹配,那么继续下一轮,如果匹配上了,当前数组删除最后一个元素,右边列表删除第一个元素,继续匹配他们是否契合,契合的双方就牵手成功,一起离开舞台;
  4. 最后遍历结束,看看有没有男嘉宾还留在台上(stack)即可。

实现

/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
var validateStackSequences = function(pushed, popped) {
    const n = pushed.length;

    // 待选区,没跟心动女生配对上的走过来
    let stack = [];
    // 所有男嘉宾依次上台
    for (let i = 0; i < n; i++) {
        stack.push(pushed[i]);

        // 待选区最后一个男嘉宾和第一位女嘉宾是否匹配
        while (stack.length && stack[stack.length - 1] === popped[0]) {
            // 牵手成功, 最后一位男嘉宾和第一位女嘉宾携手离场
            stack.pop();
            popped.shift();
        }
    }

    // 判断是否所有男嘉宾都离场即可
    return stack.length === 0;
};
复制代码

结果

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

猜你喜欢

转载自juejin.im/post/7036752648300658696