力扣 456. 132模式 枚举 二分 贪心 单调栈

54 篇文章 1 订阅
14 篇文章 0 订阅

https://leetcode-cn.com/problems/132-pattern/
在这里插入图片描述
思路一:枚举位置 j j j,根据贪心思想, a i a_i ai自然要取左侧最小的那个值,那么假设我们有一个数据结构可以维护有序的元素,删除、插入、查询的复杂度都是 l o g ( n ) log(n) log(n),这个问题就解决了。在右侧待选数据中二分找到 > a i >a_i >ai的最小的数,再看其与 a j a_j aj关系即可。

from sortedcontainers import SortedList

class Solution:
    def find132pattern(self, nums: List[int]) -> bool:
        n=len(nums)
        if n<3:
            return False
        left_min=nums[0]
        j=1
        right_list=SortedList(nums[2:])
        while j<n-1:
            if nums[j]<=left_min:
                left_min=nums[j]
            else:
                # 找到右侧所有数据中大于left_min的第一个数据的下标
                index=right_list.bisect_right(left_min)
                if index<len(right_list) and right_list[index]<nums[j]:
                    return True
            j+=1
            right_list.remove(nums[j])
        return False

思路二:单调递减栈从右向左维护待选的 a k a_k ak,当遇到大于栈顶的元素时,可以把它当作待选的 a j a_j aj,不断弹出栈顶找到最大的 < a j <a_j <aj a k a_k ak,下一步只要判断是否有合适的 a i a_i ai即可。

from sortedcontainers import SortedList

class Solution:
    def find132pattern(self, nums: List[int]) -> bool:
        n=len(nums)
        if n<3:
            return False
        stk=[nums[n-1]]
        maxk=float("-inf")
        for i in range(n-2,-1,-1):
            if nums[i]<maxk:
                return True
            while len(stk)>0 and nums[i]>stk[-1]:
                maxk=stk[-1]
                stk.pop()
            if nums[i]>maxk:
                stk.append(nums[i])
        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值