leetcode 132模式 python

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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值