单调队列变体
注意到132模式中32为时序上有序,联想到单调队列
由于枚举1的时候需已经计算过32,因此反向遍历
靠近1的要足够高,因此维护从栈底到栈顶的单增序列
加入任意元素至栈中时,弹出小于它的元素。此时可以将弹出的元素看做2,当前的元素看做3,只要是被弹出的元素,必定是被一个更大的元素所弹出,切该元素必定在被弹出元素的前方。因此仅需判断所有被弹出的元素中的最大值是否大于当前枚举的元素即可
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
INF = 1e10
mx = -INF
que = [nums[-1]]
for i in reversed(nums[:-1]):
if i < mx:
return True
else:
while len(que) and i > que[-1]:
mx = max(mx, que[-1])
que.pop()
que.append(i)
return False