美文网首页
LeetCode 946. Validate Stack Seq

LeetCode 946. Validate Stack Seq

作者: 微微笑的蜗牛 | 来源:发表于2020-03-14 19:36 被阅读0次

    @(LeetCode)

    问题描述

    给定两个数组 pushedpopped,数组内部元素均不相同。如果在一个空栈上操作,能得出 pushedpopped 的结果,则返回 true

    栗 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
    
    解释:
    push(1), push(2), push(3), push(4), pop() -> 4, pop() -> 3,
    push(5), pop() -> 5。
    此时栈顶为 2,而需要 pop 的值为 1,因此无法出栈。
    

    注意:

    1. 0 <= pushed.length == popped.length <= 1000
    2. 0 <= pushed[i], popped[i] < 1000
    3. pushedpopped 的排列数。
    4. pushedpoped 内部元素值不同。

    想看英文原文的戳这里

    解题思路

    我的解法

    初始为空栈,在经过一系列的进栈和出栈操作后,如果最终栈为空,则说明操作可行。

    思路比较简单,只需要逐个对比当前 pushpop 的元素:

    • 若需要入栈和出栈的元素相等,那么出入栈是匹配的,元素不用入栈,省去入栈和出栈的过程。此时 pop 的元素会指向下一个,需要循环判断当前栈顶元素是否与其匹配,从而进行出栈操作。
    • 若不相等,则进栈。

    如果最终栈为空,则返回 true

    js 代码如下:

    /**
     * @param {number[]} pushed
     * @param {number[]} popped
     * @return {boolean}
     */
    var validateStackSequences = function(pushed, popped) {
        let list = new Array()
        let i = 0
        let j = 0
    
        while (i < pushed.length) {
            // 相等,不需要 push
            if (pushed[i] === popped[j]) {
                // pop 元素指向下一个
                j += 1
    
                // 循环判断 list 栈顶是否可以出栈
                while (list.length > 0 && (list[list.length - 1] === popped[j])) {
                    list.pop()
                    j += 1
                }
            } else {
                // 入栈
                list.push(pushed[i])
            }
    
            i += 1
        }
    
        if (list.length === 0) {
            return true
        }
    
        return false
    };
    

    其他解法

    其他的解法思路差不多,只不过其没有判断当前入栈的元素和出栈的元素是否相同,统一直接入栈,然后再不断对比栈顶元素。

    以上解法中空间复杂度为 O(N)。在讨论区发现有一种 O(1) 的解法,使用原 pushed 的空间达到同样的效果,比较巧妙。

    可能有同学会担心 pushed 元素被覆盖的问题。 在这种方式中,如果栈顶元素匹配,索引会回退,始终占据之前的空间,因此不会覆盖。

    😆自己在纸上走一遍过程就清楚了。

    Java 代码如下:

    public boolean validateStackSequences(int[] pushed, int[] popped) {
        int i = 0, j = 0;
        for (int x : pushed) {
            // 直接进栈,使用原来的空间
            pushed[i++] = x;
        
            // 不断对比栈顶元素
            while (i > 0 && pushed[i - 1] == popped[j]) {
                --i; 
                ++j;
            }
        }
    
        return i == 0;
    }
    

    相关文章

      网友评论

          本文标题:LeetCode 946. Validate Stack Seq

          本文链接:https://www.haomeiwen.com/subject/pbjnshtx.html