456. 132模式
1. 题目描述 456. 132模式
给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。
注意:n 的值小于15000。
示例1:
输入: [1, 2, 3, 4]
输出: False
解释: 序列中不存在132模式的子序列。
示例 2:
输入: [3, 1, 4, 2]
输出: True
解释: 序列中有 1 个132模式的子序列: [1, 4, 2].
2. 思路 来源:力扣(LeetCode)
从后往前遍历找到符合条件的次大值(注意只用找次大值)
之后只需要和次大数值比较即可,如果当前元素<次大值则返回true
寻找右面符合条件的最大值和次大值的方法如下:
如果当前元素小于栈顶元素,则入栈
如果当前元素大于栈顶元素,则先出栈,出到当前元素小于栈顶元素(之前的一个局部最大值),出的同时让second和出栈元素比较,取较大的那个(临界条件)
3. 题解
class Solution: def find132pattern(self, nums) -> bool: if len(nums)<3: return False second = float('-inf') stack = [] stack.append(nums[-1]) for i in range(len(nums)-2, -1, -1): if nums[i]<second: return True else: while(stack and nums[i]>stack[-1]): second = max(second, stack.pop()) stack.append(nums[i]) return False

浙公网安备 33010602011771号