leetcode 132模式 python
题目描述:
给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。
链接:
https://leetcode-cn.com/problems/132-pattern/
解1:暴力解
def find132pattern(nums):
listlen = len(nums)
flag=0
for i in range(listlen-2):
for j in range(i+1,listlen-1):
for k in range(j+1,listlen):
if nums[i]<nums[j]:
if nums[i]<nums[k]:
if nums[k]<nums[j]:
flag = flag+1
if flag>0:
return True
else:
return False
题目中提交的样例均通过,提交后出现超时

改进1:调用itertools

关于itertools Combinations与permutations区别参考:
https://www.geeksforgeeks.org/permutation-and-combination-in-python/
Combinations在排列组合时不会改变输入list中个元素顺序,即Combinations得到的每个排列组合中元素顺序都保持与原list一致
但permutations不考虑顺序,输出所有组合方案。
但提交仍超时
改进二:单调递减栈
参考:https://gaozhiyuan.me/algorithms/132-pattern.html
https://my.oschina.net/u/4607048/blog/4475114
维护一个单调递减栈,将list从右向左一次入栈,若遇到无法入栈的情况,说明当前元素大于其右边的元素,满足132中的32,将原栈中最后一个元素压出,保存在third变量,将新元素入栈,入栈后继续向左判断,若可以入栈则将该值与third比较,若小于third则找到。python中无stack结构,可以通过list模拟。
def find132pattern(nums):
mystack = []
third = float("-inf")
numlen = len(nums)
for i in range(numlen-1,-1,-1):
if nums[i]<third:
return True
if mystack and nums[i]>mystack[-1]:
third = mystack.pop()
mystack.append(nums[i])
return False
result = find132pattern([3,5,7,6,5])
print(result)
关于while循环:
若132模式中2之后的数大于2,则在while中会先pop出2之后的数,再pop出2位置的数,并将其保存在third中
若132模式中2之后的数小于2,在2入栈之前,其后的数字已经被压出,third变量仍保存2

677

被折叠的 条评论
为什么被折叠?



