美文网首页
栈-N946-验证栈序列

栈-N946-验证栈序列

作者: 三次元蚂蚁 | 来源:发表于2019-04-01 12:18 被阅读0次

题目

  • 概述:给定一个入栈序列和出栈序列,判断如果以入栈序列的顺序入栈,所给定的出栈序列的顺序是否是合理的

  • 输入:入栈序列和出栈序列

    1. 序列长度一致,范围为[0, 1000]
    2. 入栈序列是出栈序列的排列
  • 输入子项:[0, 1000)的整数

  • 输出:对于所给定的入栈序列,出栈序列合理返回true,否则返回false

  • 出处:https://leetcode-cn.com/problems/validate-stack-sequences/

思路

  • 遍历出栈序列
  1. 若当前出栈项在未入栈的序列中,则依次将未入栈的序列到该项为止的数(不包括该项)入栈

  2. 若当前出栈项不在未入栈的序列中,则将栈中元素依次出栈直至出栈元素等于当前出栈项

    若未在栈中找到对应的出栈项,则该出栈序列不合理,返回false

  3. 如果能够正确遍历完出栈序列,则证明出栈序列合理,返回true

  4. 用map存储未入栈序列,使得能够快速判断当前出栈项是否在未入栈的序列中,并在入栈的过程中更新map

代码

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        LinkedList<Integer> stack = new LinkedList<>();
        Map<Integer, Integer> map = new HashMap<>();
        Integer appearCnt;
        for (int i = 0; i < pushed.length; ++i) {
            appearCnt = map.get(pushed[i]);
            if (appearCnt == null) {
                map.put(pushed[i], 1);
            } else {
                map.put(pushed[i], appearCnt + 1);
            }
        }
        
        int j, splitIndex = 0;
        boolean popSuccess;
        for (int i = 0; i < popped.length; ++i) {
            if (map.get(popped[i]) != null) {
                for (j = splitIndex; j < pushed.length; ++j) {
                    appearCnt = map.get(pushed[j]);
                    if (appearCnt > 1) {
                        map.put(pushed[j], appearCnt - 1);
                    } else {
                        map.remove(pushed[j]);
                    }
                    if (pushed[j] == popped[i]) {
                        splitIndex = j + 1;
                        break;
                    }
                    stack.push(pushed[j]);
                }
            } else {
                popSuccess = false;
                while (!stack.isEmpty()) {
                    if (stack.pop() == popped[i]) {
                        popSuccess = true;
                        break;
                    }
                }
                if (!popSuccess) {
                    return false;
                }
            }
        }
        
        return true;
    }
}

相关文章

  • 栈-N946-验证栈序列

    题目 概述:给定一个入栈序列和出栈序列,判断如果以入栈序列的顺序入栈,所给定的出栈序列的顺序是否是合理的 输入:入...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • LeetCode刷题之路 验证栈序列

    验证栈序列【中等】 给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 pus...

  • 一些常见的算法题目

    合法的出栈序列 已知1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,返回等待后面的数字入栈出...

  • 946. 验证栈序列

    题目描述: 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上...

  • 946. 验证栈序列

    给定pushed和popped两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入 push ...

  • 946. 验证栈序列

    给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 ...

  • 作业帮做-栈结构验证

    顺序栈操作验证 实验目的 掌握栈的顺序存储结构; 验证栈的操作特性; 掌握顺序栈的基本操作实现方法。 实验内容 建...

  • 栈的压入弹出顺序

    题意:条件:给出一个栈的输入序列和一个输出序列问题:你判断输出序列是否合法,即通过输入序列的入栈顺序能否通过出栈操...

  • 算法 1.3.2 栈的压入弹出序列 【leetcode 946】

    题目描述 验证栈序列给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最...

网友评论

      本文标题:栈-N946-验证栈序列

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