LeetCode456:132模式(单调栈)
解题思路:根据题意,我们首先首先要找到所有的极大值点,同时记录当前极大值点的左边的最小值。遍历所有点,看是否能够满足132条件。虽然记录极大值点的地方可以优化,减小比较的次数,但是由于我们不知道极大值点有可能有多少个,复杂度可能还是会比较大。
最关键的优化地点是如何减少比较的次数,我们需要用单调栈维护一个[i,n]区间的单调递减的栈,目的是找到极值点 i 在[i,n]区间小于 nums[i]的最大值,所以我们需要从数组的尾部开始向前构建一个单调栈。我们从之前的解法可以知道极值点在后面的最小值一定比极值点在前面的最小值要小,因此,如果栈中的较小的元素满足不了后面的极值点的132条件,那么就不需要担心弹出栈之后,会满足前面的极值点的132条件。(AC代码并不是这个版本的,在此仅做记录,等到重新做的时候再补。)
class Solution: def find132pattern(self, nums): stack = [] # inf = 1e9+10 mini = inf for i in range(len(nums)): if mini > nums[i]: mini = nums[i] if i !=len(nums)-1 and i !=0: if nums[i] >nums[i-1] and nums[i] > nums[i+1]: while stack: if stack[-1][0] < nums[i]: stack.pop() else: break stack.append((nums[i],mini)) for s in stack: if s[0] > nums[i] > s[1]: return True return False