• 剑指 Offer 31. 栈的压入、弹出序列 && Leetcode 946. 验证栈序列


    地址  https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
    例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。   示例 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 之前弹出。   提示: 0 <= pushed.length == popped.length <= 1000 0 <= pushed[i], popped[i] < 1000 pushed 是 popped 的排列。 注意:本题与主站 946 题相同:https://leetcode-cn.com/problems/validate-stack-sequences/

    解答 

    我们使用一个stack数据结构来模拟即可。

    由于栈的本身是先入后出而且只能弹出栈顶元素,题目也提到压入栈的元素都不相等。

    那么弹出的执行只能在压入该元素且没有压入其他元素时候进行操作。

    也就是该元素刚刚压入栈在栈顶的时候,且该元素也是pop序列的当前元素,我们将它弹出

    既然没有分支没有其他选择,我们进行模拟该操作,查看最后能否弹出全部元素即可

    图示

     1 

    2

    3

    4

    class Solution {
    public:
        stack<int> st;
        bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
            int popidx = 0;
            for(int i = 0; i < pushed.size();i++ ){
                while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){
                    st.pop();popidx++;
                }
                st.push(pushed[i]);
            }
            while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){
                    st.pop();popidx++;
            }
    
            return st.empty();
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    第二章作业
    算法第五章作业及学期总结
    71 最大子列和问题 | 采用二分法+递归
    算法第一章作业
    算法第四章作业
    算法第三章作业
    Windows charles安装、配置及Android手机ca证书
    git出现fatal: Authentication failed for 'http:xxxx.git/''错误的解决办法
    如何用c#将十六进制转换成字符串?
    系统配置win7(64位),vs2010,没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
  • 原文地址:https://www.cnblogs.com/itdef/p/14405504.html
Copyright © 2020-2023  润新知