下面分析转自于:https://blog.csdn.net/nunuwode/article/details/81990426
2.挺巧妙的方法,从后往前遍历,将数字从大到小依次压栈,当遇到一个数比栈顶大的时候,依次弹栈,将弹出来的数赋给一个变量third,然后直到遇到栈顶的数比当前这个数大,就将这个数压栈。这样就保证了在遍历的过程中,栈里保存着最大的数,third保存着最大的数下的尽量大的数。只有third尽量的大,才能更容易找到比third小的数,也就是第一个数。
比如:1 2 3 10 7 8 9 6 5
一开始栈为空,third为INT_MIN,遇到5则压栈。
栈: 5 third:INT_MIN
遇到6弹栈 栈:6 third:5
遇到9弹栈 栈:9 third:6
遇到8压栈 栈:9 8 third 6
遇到7压栈 栈:9 8 7 third 6
遇到10 将10与依次弹栈的数对比,直到栈为空或者找到比10大的数,10才进栈。因而栈为:10 third:9
遇到3 < 9 则找到一个132结构 3 10 9 return true
在这个过程中,third始终能够保持在132中第二个最大的数后面第二大的数。
import sys
class Solution:
def find132pattern(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
if n < 3:
return False
stack = []
third_nums = -sys.maxsize
for i in range(len(nums)):
if nums[n -1 - i] < third_nums:
return True
while (len(stack) >= 1) and (nums[n - 1 - i] > stack[-1]):
third_nums = stack.pop(-1)
stack.append(nums[n - 1 - i])
return False