• LeetCode456:132模式(单调栈)


     解题思路:根据题意,我们首先首先要找到所有的极大值点,同时记录当前极大值点的左边的最小值。遍历所有点,看是否能够满足132条件。虽然记录极大值点的地方可以优化,减小比较的次数,但是由于我们不知道极大值点有可能有多少个,复杂度可能还是会比较大。

    最关键的优化地点是如何减少比较的次数,我们需要用单调栈维护一个[i,n]区间的单调递减的栈,目的是找到极值点 i 在[i,n]区间小于 nums[i]的最大值所以我们需要从数组的尾部开始向前构建一个单调栈。我们从之前的解法可以知道极值点在后面的最小值一定比极值点在前面的最小值要小,因此,如果栈中的较小的元素满足不了后面的极值点的132条件,那么就不需要担心弹出栈之后,会满足前面的极值点的132条件。(AC代码并不是这个版本的,在此仅做记录,等到重新做的时候再补。)

    class Solution:
        def find132pattern(self, nums):
            stack = [] #
            inf = 1e9+10
            mini = inf
            for i in range(len(nums)):
                if mini > nums[i]:
                    mini = nums[i]
                if i !=len(nums)-1 and i !=0:
                    if nums[i] >nums[i-1] and nums[i] > nums[i+1]:
                        while stack:
                            if stack[-1][0] < nums[i]:
                                stack.pop()
                            else:
                                break
                        stack.append((nums[i],mini))
                for s in stack:
                    if s[0] > nums[i] > s[1]:
                        return True
            return False
  • 相关阅读:
    java运算符
    Java中的变量与常量
    java 的数据类型
    Windows Server 2012 R2上安装.Net4.6.1出错
    数据库面试基础知识整理
    C语言面试程序阅读整理
    C语言面试基础知识整理
    Android Studio工程项目打包成SDK(jar或aar格式)
    Android Studio 添加引用Module项目
    Android Studio打包SDK后,为什么没有bundles文件夹?
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/14573922.html
Copyright © 2020-2023  润新知