lintcode 132 模式
题目要求
给你一个 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。后来想了挺久没什么思路于是谷歌了一下,搜到了几种做法好好学习了一下。
- 首先我们的目标是,要寻找三个满足某种关系的数是否在一个列表nums[]中出现。很容易想到我们可以用一个三重循环暴力枚举就好了,显然我们是不可能用这种方法的。那有什么方法呢?凭着多年的数学经验,直觉告诉我们,要找三个索引有序的数i, j, k我们应该把目标设为中间那个j。
- 我们可以通过遍历来寻找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最小 - 在花费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的值.
- 我们从后往前遍历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 模式的更多相关文章
- [LeetCode] 132 Pattern 132模式
Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that ...
- [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 ...
- Leetcode 456.132模式
132模式 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计 ...
- 456 132 Pattern 132模式
给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计一个算法,当 ...
- LeetCode——456.132模式
给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计一个算法,当 ...
- Java实现 LeetCode 456 132模式
456. 132模式 给定一个整数序列:a1, a2, -, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj ...
- 【python】Leetcode每日一题-132模式
[python]Leetcode每日一题-132模式 [题目描述] 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j &l ...
- 【LeetCode】456. 132 Pattern
Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that ...
- [leetcode] 456. 132 Pattern (Medium)
对一个三个元素以上的数组,如果存在1-3-2模式的组合,则返回true. 1-3-2模式就是值的排序是i<k<j但是下标排序是i<j<k. 解法一: 硬解,利用一个变量存储是否 ...
随机推荐
- 分页复用代码【Page类、JSP显示页面】
前言 为了复用,记载一些以前写过的工具类.方法 page类 import java.util.List; /** * Created by ozc on 2017/3/1. */ public cla ...
- 启动PHPstudy提醒80、3306端口被占用
端口占用会出现如下提醒 解决办法: 进入dos窗口:快捷键win+R,然后输入cmd 在dos窗口中输入命令:netstat -ano(查找各端口所在进程的PID) 找到80和3306的程序PID ...
- 渗透相关website
开源安全测试方法论:http://www.isecom.org/research/osstmm.html 信息系统安全评估框架:www.oissg.org/issaf 开放式web应用程序安全项目(O ...
- LinkedHashMap 源码解析
概述: LinkedHashMap实现Map继承HashMap,基于Map的哈希表和链该列表实现,具有可预知的迭代顺序. LinedHashMap维护着一个运行于所有条目的双重链表结构,该链表定义了迭 ...
- 当你的SSM项目中的springmvc.xml发生第一行错误解决方案
当你新建了一个SSM项目,你复制网上的xml文件来配置或者你下载了一个SSM项目打开发现xml文件错误,打开是第一行报错的时候你是不是很懵逼 或者是这样 总之就是xml文件中<?xml vers ...
- Linux入门之常用命令(12) mount
查看Linux所有设备 cd /dev ls -l sd* //分区 查看Linux磁盘 fdisk -lu 挂载 一般挂载至/mnt /media mount /dev/sda5 /mnt/ ...
- The Nerd Factor SPOJ - MYQ5
The Nerd Factor Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Submi ...
- 利用百度地图WEB服务APIGeoCoding API批量地址解析
Geocoding API包括地址解析和逆地址解析功能: 地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.3 ...
- Tomcat 设置自启动时遇到的错误问题与解决方案
首先,今天在做tomcat开机自启动时,原本很简单的一个问题,但却浪费了很长时间: 首先系统环境采用的是Window10,设置Tomcat自启动过程当中需要注意的是:JDK的版本和Tomcat的位数必 ...
- VBA /VB/VB中合成分散数据方法
公司用于项目号的合成,怕忘记,特此放上这里.若能帮助其它道友,善莫大焉. 比如:001,004,006,007,008,009,010 结果可以输出:001,004,006-010 逻辑:1.获得数据 ...