一、题目描述
给定一个整数序列:a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。
注意:n 的值小于15000。
示例1:
1 | 输入: [1, 2, 3, 4] |
示例 2:
1 | 输入: [3, 1, 4, 2] |
示例 3:
1 | 输入: [-1, 3, 2, 0] |
二、题解
1.算法描述
- 栈的应用
2.个人分析
参考官解
- 为了便于分析,我们约定:
- “1”:小
- “3”:大
- “2”:中
- 首先考虑
小 < 大
的情况,我们可以维护一个前缀最小值的数组min[]
,这样,小 < 大
便是最优解 - 其次考虑
大 > 中
的情况,我们需要申请一个栈,从后向前遍历数组,- 当
nums[j] > min[j]
时,将nums[j]
进栈 - 如果栈不为空,并且
nums[j] > stack[top]
时,我们就找到了我们需要的中
,返回true
; - 如果栈不为空,但是
min[j] >= stack[top]
时,我们就需要一直出栈,直到找到我们所需要的中
- 当
- 如果遍历完整个数组,都没有找到,则返回
false
3.代码
1 | bool find132pattern(int *nums, int numsSize) |