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

 

posted @ 2019-08-28 12:38  三年一梦  阅读(176)  评论(0)    收藏  举报