🧮 Algorithm Notebook
1、算法准备
1.1 牛客网编程OJ的典型输入输出
2、算法框架
2.1 动态规划
2.1.1 斐波那契数列
2.1.2 背包问题
2.1.3 贪心算法
2.1.4 序列和数组类问题
2.1.5 编辑距离
2.1.6 高楼扔鸡蛋
2.1.7 股票问题系列通解
2.1.8 最长有效括号
2.1.9 剪绳子
2.1.10 正则表达式匹配
2.2 二分查找
2.2.1 二分查找框架
2.2.2 搜索旋转排序数组
2.3 链表
2.3.1 反转链表
2.3.2 相交链表
2.3.3 合并链表
2.3.4 链表中倒数第k个节点
2.3.5 复制带随机指针的链表
2.4 排序算法
2.4.1 常见排序算法
2.5 二叉树
2.5.1 二叉树遍历
2.5.2 岛屿问题
2.5.3 二叉树路径问题
2.5.4 构造二叉树
2.6 回溯算法
2.6.1 回溯算法解题框架
2.6.2 N皇后
2.7 数组
2.7.1 删除有序数组中的重复项
2.7.2 滑动窗口最大值
2.7.3 调整数组顺序使奇数位于偶数前面
2.7.4 螺旋矩阵
2.7.5 多数元素
2.7.6 最大数
2.7.7 和为s的两个数字
2.7.8 构建乘积数组
2.7.9 两数之和
2.8 字符串
2.8.1 最小覆盖子串
2.8.2 比较版本号
2.8.3 验证IP地址
2.8.4 基本计算器 II
2.8.5 字符串解码
2.8.6 移掉 K 位数字
2.8.7 无重复字符的最长子串
2.8.8 第一个只出现一次的字符
2.8.9 翻转字符串里的单词
2.8.10 字符串转换整数 (atoi)
2.8.11 字符串四则运算
2.9 栈
2.9.1 最小栈
2.9.2 弹出序列
2.10 数学
2.10.1 用 Rand7() 实现 Rand10()
2.10.2 只出现一次的数字
2.10.3 整数反转
2.10.4 求1+2+…+n
2.10.5 二进制中1的个数
2.10.6 幂运算
2.10.7 1~n 整数中 1 出现的次数
2.10.8 数字序列中某一位的数字
2.10.9 丑数
2.10.10 n个骰子的点数
2.10.11 圆圈中最后剩下的数字
2.10.12 不用加减乘除做加法
2.10.13 x 的平方根
2.11 设计
2.11.1 LRU 缓存机制
-
+
tourist
register
Sign in
弹出序列
## 1 题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 **示例 1:** ```txt 输入: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:** ```txt 输入: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 的排列。 ## 2 问题分析 1. **考虑使用一个辅助栈**,**模拟压入/弹出操作的排列**,**根据是否模拟成功**,**即可得到结果**: 1. **入栈操作**:**按照压栈序列的顺序执行**。 2. **出栈操作**:**每次入栈后**,**循环判断 `栈顶元素 = 弹出序列的当前元素` 是否成立**,**将符合弹出序列顺序的栈顶元素全部弹出**。 > 由于题目规定,**栈的所有数字均不相等**,因此**在循环入栈中**,**每个元素出栈的位置的可能性是唯一的**(若有重复数字,则具有多个可出栈的位置),因而,**在遇到 `栈顶元素 = 弹出序列的当前元素` 时就应该立即执行出栈**。 > 2. 算法流程如下: 1. **初始化**:辅助栈 $stack$,弹出序列的索引 $index$。 ![](/media/202206/2022-06-14_110221_872230.png) 2. **遍历压栈序列**,各元素记为 $num$: 1. 元素 $num$ 入栈。 2. 循环出栈,若 $stack$ 的栈顶元素 = 弹出序列元素 $popped[index]$,则执行出栈与 $index++$。 ![](/media/202206/2022-06-14_110303_305790.png) ![](/media/202206/2022-06-14_110315_645194.png) ![](/media/202206/2022-06-14_110328_346122.png) ![](/media/202206/2022-06-14_110338_984414.png) ![](/media/202206/2022-06-14_110351_209550.png) ![](/media/202206/2022-06-14_110415_874802.png) ![](/media/202206/2022-06-14_110427_833572.png) ![](/media/202206/2022-06-14_110438_865584.png) ![](/media/202206/2022-06-14_110451_401869.png) 3. **返回值**:若 $stack$ 为空,则此弹出序列合法。 ![](/media/202206/2022-06-14_110546_566231.gif) ## 3 参考代码 ```java /** * 剑指 Offer 31. 栈的压入、弹出序列 * @param pushed 压入序列 * @param popped 弹出序列 * @return 弹出序列是否是压入序列对应栈的弹出序列 */ public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> stack = new Stack<>(); int index = 0; for (int num: pushed) { stack.push(num); while (!stack.isEmpty() && stack.peek() == popped[index]) { stack.pop(); index++; } } return stack.isEmpty(); } ``` ## 参考文献 1. [剑指 Offer 31. 栈的压入、弹出序列](https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof)。 2. [面试题 31. 栈的压入、弹出序列(模拟,清晰图解)](https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/mian-shi-ti-31-zhan-de-ya-ru-dan-chu-xu-lie-mo-n-2)。
ricear
June 14, 2022, 11:17 a.m.
©
BY-NC-ND(4.0)
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password