题目要求

给你一个 n 个整数的序列 a1,a2,...,an,一个 132 模式是对于一个子串 ai,aj,ak,满足 i < j < k 和 ai < ak < aj。设计一个算法来检查输入的这 n 个整数的序列中是否存在132模式。
n 会小于 20,000

样例

给你序列 nums = [1,2,3,4] 
返回 False//没有132模式在这个序列中。
给你序列 nums = [3,1,4,2] 
返回 True//存在132模式:[1,4,2]。

分析

这道题刚做的时候没有看清楚题意,结果写成了连续连续三个数的132模式Orz。后来想了挺久没什么思路于是谷歌了一下,搜到了几种做法好好学习了一下。

  1. 首先我们的目标是,要寻找三个满足某种关系的数是否在一个列表nums[]中出现。很容易想到我们可以用一个三重循环暴力枚举就好了,显然我们是不可能用这种方法的。那有什么方法呢?凭着多年的数学经验,直觉告诉我们,要找三个索引有序的数i, j, k我们应该把目标设为中间那个j
  2. 我们可以通过遍历来寻找j,那么找出j后呢?我们需要找到比j小的那个i,i值得选择是nums中前j个数的最小值,要找最小值的话有个非常好的方法,那就是创建一个数组,数组的值为前“索引”个数的最小值,举个例子
    list = [14, 5, 7, 4, 9, 10, 2, 8]
    minp[0] = 14  //[14]中14最小
    minp[1] = 5  //[14, 5]中5最小
    minp[2] = 5
    minp[3] = 4
    minp[5] = 4
    .
    minp[6] = 2
    minp[7] = 2 //[14, 5, 7, 4, 9, 10, 2, 8]中2最小
  3. 在花费O(n)的时间复杂度找出所有位置处的数之前的最小值后,那在我们遍历j时,那么之后只需要把目光集中在判断
    nums[j] > nums[k] and minp[j] < nums[k]

    那么这个k我们需要怎么找呢?我们可以在这之后用一个二重循环来枚举j,k,但是我们需要更快的方法,我们之所以想用二重循环是因为我们想让j,k的位置同时移动并且记录它们的值,那有没有什么办法可以在一个循环内控制j,k的移动和记录呢?答案是有的,我们可以利用栈,我们利用列表nums和栈Kstack。nums同时负责j,k的移动但只记录j,利用辅助栈Kstack来记录k的值.

  4. 我们从后往前遍历j,当满足第一个最简单的要求后开始j,k的判断,把不满足条件的num[j]压入Kstack中当做k的备用,再往前移动,直到满足j值大于Kstack的top值后再把Kstack中的top值拉出和minp[j]比较即可
 class Solution:
"""
@param: nums: a list of n integers
@return: true if there is a 132 pattern or false
""" def find132pattern(self, nums):
# write your code here Kstack = []
n = len(nums)
if n < 3:
return False
minp = n * [0]
minp[0] = nums[0] for i in range(1, n):
minp[i] = min(minp[i - 1], nums[i]) for j in range(n - 1, 0, -1):
if nums[j] > minp[j]:
max = -sys.maxsize
while len(stack) > 0 and nums[j] > Kstack[-1]:
max = Kstack.pop()
if max > minp[j - 1]:
return True
Kstack.append(nums[j])
return False

lintcode 132 模式的更多相关文章

  1. [LeetCode] 132 Pattern 132模式

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that  ...

  2. [Swift]LeetCode456. 132模式 | 132 Pattern

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that  ...

  3. Leetcode 456.132模式

    132模式 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计 ...

  4. 456 132 Pattern 132模式

    给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计一个算法,当 ...

  5. LeetCode——456.132模式

    给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计一个算法,当 ...

  6. Java实现 LeetCode 456 132模式

    456. 132模式 给定一个整数序列:a1, a2, -, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj ...

  7. 【python】Leetcode每日一题-132模式

    [python]Leetcode每日一题-132模式 [题目描述] 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j &l ...

  8. 【LeetCode】456. 132 Pattern

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that  ...

  9. [leetcode] 456. 132 Pattern (Medium)

    对一个三个元素以上的数组,如果存在1-3-2模式的组合,则返回true. 1-3-2模式就是值的排序是i<k<j但是下标排序是i<j<k. 解法一: 硬解,利用一个变量存储是否 ...

随机推荐

  1. Mysql中的like模糊查询

    MySql的like语句中的通配符:百分号.下划线和escape %代表任意多个字符 _代表一个字符 escape,转义字符后面的%或_,使其不作为通配符,而是普通字符匹配   数据库数据如下: 1. ...

  2. 支持语音识别、自然语言理解的微信小程序(“遥知之”智能小秘)完整源码分享

    记录自己搭建https的silk录音文件语音识别服务的调用过程,所有代码可在文中找链接打包下载 >>>>>>>>>>>>> ...

  3. BlockingQueue<> 队列的作用

    BlockingQueue<> 队列的作用 BlockingQueue 实现主要用于生产者-使用者队列 BlockingQueue 实现主要用于生产者-使用者队列,BlockingQueu ...

  4. ArrayList,LinkedListd等容器使用时注意点:

    1.对这两个List(包括其他的类似容器),如果向里面加入一个元素(引用数据类型),那么这个List里面保存的是这个对象的引用: 如果想要避免这种现象可以这样:在加入新的元素时不直接压,将已有的对象复 ...

  5. adobe acrobat pro 9破解方法

    方法一:(经常没用,不推荐) 尝试一下部分常见序列号: 网上搜 方法二: (能找到文件的,推荐) 1.到 C:\Program Files\Common Files\Adobe\Adobe PCD\c ...

  6. 新建maven项目遇到Select an Archetype时没有maven-archetype-webapp处理方法

    [已经有很多博客写过相关的了.详细请去看其他博主的.这里只是记录新建的时候发生的问题给新手提供帮助.因为我跟我的同事都遇到了.因为没记录下来,又花了时间找问题.而网上好像也不多.所以记录下来.希望帮到 ...

  7. vue组件初学--弹射小球

    1. 定义每个弹射的小球组件( ocicle ) 2. 组件message自定义属性存放小球初始信息(可修改) { top: "0px", //小球距离上方坐标 left: &qu ...

  8. Java子线程中的异常处理(通用)

    在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...

  9. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  10. 一个“.java”文件中是否可以包含多个类(不是内部类)?有什么限制?

    可以,若这个类的修饰符是public则,其类名须与文件名相同.