惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Last Week in AI
Last Week in AI
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
The Cloudflare Blog
罗磊的独立博客
月光博客
月光博客
N
Netflix TechBlog - Medium
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
Jina AI
Jina AI
J
Java Code Geeks

博客园 - Fanny123

LeetCode最大数字范围的整数之和 LeetCode统计好子数组 LeetCode边界与内部和相等的稳定子数组 三段式数组II 变为活跃状态的最小时间 平衡装运的最大数量 三段式数组 I 相邻字符串之间的最长公共前缀 分割字符串 找出数组中的所有 K 近邻下标 使叶子路径成本相等的最小增量 硬币面值还原 检查元素频次是否为质数 等积子集的划分方案 统计一个数组中好对子的数目 LeetCode 1482. 制作 m 束花所需的最少天数 C# 基础(更新中) 圆形靶内的最大飞镖数量 丑数 BST的中序后继
验证栈序列
Fanny123 · 2019-12-11 · via 博客园 - Fanny123

验证栈序列,给定push和pop序列,是否可能是一对出栈入栈组合。

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

思路:
利用Stack数据结构。
从j出发:访问到pop[j]的时候,需要把push里对应的这个值的前面所有值都压入栈。
i和j指向当前的push和pop,当栈顶不为pop[j]时,i的值一直入栈并向后移动。然后弹出j的值。最后i遍历完后,验证栈弹出的顺序和j的顺序。
校验条件:

  1. 弹出时,一定是j的值。i一直向后移动,可能移动到最后了,还没有j想要的值,这时候栈顶不是j的值,返回false。
  2. 最后全体出战与j的顺序
public boolean validateStackSequences(int[] pushed, int[] popped) {
    int n=pushed.length;
    Stack<Integer> stack=new Stack<>();
    int i=0;
    int j=0;
    while(i!=n&&j!=n){
        while(stack.isEmpty()||stack.peek()!=popped[j]){
            stack.push(pushed[i++]);
            if(i==n){
                break;
            }
        }
        //弹出
        if(stack.pop()!=popped[j]){//出栈必须是j的值
            return false;
        }
        j++;   
    }
    while(!stack.isEmpty()&&j!=n){//最后的验证
        int tmp=stack.pop();
        if(tmp!=popped[j++]){
            return false;
        }
    }
    return stack.isEmpty()&&i==n&&j==n;
}

换个方向思考:
从i的角度出发:每次把i的值压入站。连续检查栈顶是不是需要弹出。

public boolean validateStackSequences(int[] pushed, int[] popped) {
    int n=pushed.length;
    int j=0;
    Stack<Integer> stack=new Stack<>();
    for(int val:pushed){
        stack.push(val);
        while(!stack.isEmpty()&&j!=n&&stack.peek()==popped[j]){
            stack.pop();
            j++;
        }
    }
    return j==n;//j!=n等价于stack不为空,因为stack历史总记录是n个
}