zoukankan      html  css  js  c++  java
  • LeetCode 456. 132模式

    456. 132模式

    Difficulty: 中等

    给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]nums[j]nums[k] 组成,并同时满足:i < j < knums[i] < nums[k] < nums[j]

    如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false

    进阶:很容易想到时间复杂度为 O(n^2) 的解决方案,你可以设计一个时间复杂度为 O(n logn)O(n) 的解决方案吗?

    示例 1:

    输入:nums = [1,2,3,4]
    输出:false
    解释:序列中不存在 132 模式的子序列。
    

    示例 2:

    输入:nums = [3,1,4,2]
    输出:true
    解释:序列中有 1 个 132 模式的子序列: [1, 4, 2] 。
    

    示例 3:

    输入:nums = [-1,3,2,0]
    输出:true
    解释:序列中有 3 个 132 模式的的子序列:[-1, 3, 2]、[-1, 3, 0] 和 [-1, 2, 0] 。
    

    提示:

    • n == nums.length
    • 1 <= n <= 10<sup>4</sup>
    • -10<sup>9</sup> <= nums[i] <= 10<sup>9</sup>

    Solution

    要找到满足s1<s3<s2的组合,维护一个单调递增栈“临时”存放s2,从后往前遍历数组,如果当前数字大于栈顶元素,将栈顶元素弹出pop赋值给s3(并且s3是越弹越大,便于后面更容易找到小于s3的s1),并将该元素压入append栈中,这样保证了栈里的元素都是大于s3的;如果此时有数字小于s3,那么说明找到了满足要求的s1<s3<s2的组合。

    class Solution:
        def find132pattern(self, nums: List[int]) -> bool:
            if not nums:
                return False
            s3 = float('-inf')
            stack = []
            for i in range(len(nums)-1, -1, -1):
                if nums[i] < s3:
                    return True
                while stack and stack[-1] < nums[i]:
                    s3 = stack.pop()
                stack.append(nums[i])
            return False
    
  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14572614.html
Copyright © 2011-2022 走看看