0456. 132 模式
大约 2 分钟
---
0456. 132 模式
- 标签:栈、数组、二分查找、有序集合、单调栈
- 难度:中等
题目链接
题目大意
描述:
给定一个整数数组 ,数组中共有 个整数。「132 模式的子序列」由三个整数 、 和 组成,并同时满足: 和 。
要求:
如果 中存在「132 模式的子序列」,返回 ;否则,返回 。
说明:
- 。
- 。
- 。
示例:
- 示例 1:
输入:nums = [1,2,3,4]
输出:false
解释:序列中不存在 132 模式的子序列。- 示例 2:
输入:nums = [3,1,4,2]
输出:true
解释:序列中有 1 个 132 模式的子序列: [1, 4, 2]。解题思路
思路 1:单调栈
- 我们需要找到三个位置 ,使得 。
- 从右往左遍历数组,维护一个单调递减的栈 ,栈中存储的是可能的 值。
- 同时维护一个变量 ,表示当前找到的最大的 值。
- 对于当前位置 :
- 如果 ,说明找到了 132 模式,返回 。
- 否则,将栈中所有小于 的元素弹出,更新 为这些弹出元素的最大值。
- 将 压入栈中。
- 遍历结束后,如果没有找到 132 模式,返回 。
思路 1:代码
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
n = len(nums)
if n < 3:
return False
# 单调栈,存储可能的 nums[j] 值
stack = []
# max_k 表示当前找到的最大的 nums[k] 值
max_k = float('-inf')
# 从右往左遍历
for i in range(n - 1, -1, -1):
# 如果当前元素小于 max_k,说明找到了 132 模式
if nums[i] < max_k:
return True
# 维护单调递减栈
# 弹出所有小于当前元素的栈顶元素
while stack and stack[-1] < nums[i]:
# 更新 max_k 为弹出元素的最大值
max_k = max(max_k, stack.pop())
# 将当前元素压入栈中
stack.append(nums[i])
return False思路 1:复杂度分析
- 时间复杂度:,其中 是数组的长度。每个元素最多入栈和出栈一次。
- 空间复杂度:,其中 是数组的长度。最坏情况下栈的大小为 。