456. 132模式

发布时间 2023-10-08 19:16:22作者: BJFU-VTH

链接

https://leetcode.cn/problems/132-pattern/description/

思路

这题其实不难,就是边界条件难想。

我们可以先保证单调栈里是逆序,然后判断单调栈中较小的值是否大于当前元素(满足132的1和2的关系)。

代码

class Solution:
    def find132pattern(self, nums) -> bool:
        # 初始化单调栈
        single_stack = []
        # last_maxs暂存为第二大的值, 初始化为一个极小值, 这样好把数据刷到last_maxs中
        last_maxs = float("-inf")
        # 倒着遍历, 我们需要一个逆序的单调栈, 因为132, 我们需要求32 所以应该是逆序的
        for i in nums[::-1]:
            # 如果当前值小于第二大的值, 即满足了132, 那么就可以判定为True
            if i < last_maxs:
                return True
            # 逆序, 所以栈顶小于当前值的要弹栈
            while single_stack and single_stack[-1] < i:
                # 更新倒数第二大的值, 倒数第二大的值越大, 我们越有可能满足132, 所以可以放心的去求max
                # 并且,while 循环满足的条件是, 栈顶元素小于当前元素, 所以我们还有当前元素兜底, 随便max更新即可
                last_maxs = max(last_maxs, single_stack[-1])
                single_stack.pop()
            # 这条语句起到2条作用
            # 第一, 初始化single_stack
            # 第二, 如第二大的数比当前值还小, 那显然不满足, 证明i就是当前栈里最大的值了, 将i入栈。
            if last_maxs < i:
                single_stack.append(i)
        return False