news 2026/4/17 16:33:51

LeetCode 456 - 132 模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 456 - 132 模式


文章目录

    • 摘要
    • 描述
    • 题解答案(整体思路)
      • 为什么这题不适合正着想?
      • 核心思路一句话版
    • 题解答案(Swift 可运行 Demo)
    • 题解代码分析
      • 1. 为什么要从右往左?
      • 2. 栈里存的到底是什么?
      • 3. third 是干嘛的?
      • 4. 核心判断为什么是这样?
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3
    • 实际场景结合
      • 1. 时间序列异常检测
      • 2. 指标反转识别
      • 3. 为什么栈思路很重要?
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

LeetCode 456 是一道乍一看很绕,但想通后非常优雅的题。

很多人第一次读题时,脑子里会立刻冒出三层循环:
i < j < k,再判断nums[i] < nums[k] < nums[j]
但很快你就会发现,这样做在数据量稍微大一点时,根本跑不动。

这道题真正考的是:
你能不能把“132 关系”转换成一种顺序扫描 + 单调结构的问题。

一旦理解了这一点,这题就会从“看不懂”变成“非常巧”。

描述

题目给你一个整数数组nums,让你判断数组中是否存在一种特殊的子序列,叫132 模式

什么是 132 模式?

存在三个下标i < j < k,满足:

nums[i] < nums[k] < nums[j]

也就是说:

  • 第一个数最小
  • 第二个数最大
  • 第三个数夹在中间

只要存在任意一组,直接返回true,否则返回false

题解答案(整体思路)

为什么这题不适合正着想?

如果你从左往右去想:

  • 固定j
  • 去左边找最小的i
  • 再去右边找合适的k

你会发现状态太多,逻辑也很难压缩。

这道题真正舒服的解法是:

从右往左看,用栈维护“可能成为 3 的值”,同时动态记录“可能成为 2 的最大值”。

核心思路一句话版

  • 从右向左遍历数组
  • 用一个单调递减栈保存“可能的 3(nums[j])”
  • 用一个变量third记录“已经找到的最大 nums[k]”
  • 一旦发现nums[i] < third,说明 132 成立

题解答案(Swift 可运行 Demo)

classSolution{funcfind132pattern(_nums:[Int])->Bool{ifnums.count<3{returnfalse}varstack:[Int]=[]varthird=Int.min// 从右往左遍历fornuminnums.reversed(){// 如果当前数比 third 小,说明找到了 132ifnum<third{returntrue}// 维护单调递减栈whileletlast=stack.last,num>last{third=last stack.removeLast()}stack.append(num)}returnfalse}}

题解代码分析

这段代码短,但信息密度非常高,我们一步一步拆。

1. 为什么要从右往左?

fornuminnums.reversed(){

原因很关键:

  • 我们希望先确定nums[j]nums[k]
  • 再回头看有没有更小的nums[i]

如果你从左往右,很难“记住未来的信息”。

2. 栈里存的到底是什么?

varstack:[Int]=[]

这个栈里存的是:

还没被淘汰的、可能作为 nums[j](3 的位置)的值

而且这个栈始终保持单调递减

3. third 是干嘛的?

varthird=Int.min

third表示:

目前已经确认的,最大可能的 nums[k](2 的位置)

它来自哪里?

whileletlast=stack.last,num>last{third=last stack.removeLast()}

当你发现当前数num比栈顶大时:

  • 说明num可以作为更大的3
  • 被弹出的那个数,就成了“被夹在中间的 2”

4. 核心判断为什么是这样?

ifnum<third{returntrue}

此时的含义是:

  • 当前numnums[i]
  • third是已经找到的nums[k]
  • 而之前一定存在一个更大的nums[j]

自然满足:

nums[i] < nums[k] < nums[j]

132 模式成立。

示例测试及结果

示例 1

letsolution=Solution()print(solution.find132pattern([1,2,3,4]))

输出:

false

解释:

  • 数组严格递增
  • 永远找不到中间被夹住的值

示例 2

print(solution.find132pattern([3,1,4,2]))

输出:

true

解释:

  • 子序列[1,4,2]
  • 完整满足 132 模式

示例 3

print(solution.find132pattern([-1,3,2,0]))

输出:

true

解释:

  • 存在多组 132
  • 算法只要找到一组就会提前返回

实际场景结合

这道题的思想,在现实中非常常见。

1. 时间序列异常检测

比如股票价格:

  • 先涨
  • 再回落一点
  • 但仍高于早期低点

这本质就是一种 132 模式。

2. 指标反转识别

在监控系统中:

  • 指标低
  • 突然拉高
  • 又回落到中间区间

这类“先拉高再回调”的结构,本质和 132 一样。

3. 为什么栈思路很重要?

因为它能把:

  • “多点关系”
  • “跨区间比较”

压缩成一次线性扫描。

这是工程里非常值钱的能力。

时间复杂度

  • 每个元素最多进栈、出栈一次

时间复杂度:

O(n)

空间复杂度

  • 使用了一个栈

空间复杂度:

O(n)

总结

LeetCode 456 是一道非常典型的“思路型”题目

  • 不是靠暴力
  • 不是靠技巧堆叠
  • 而是靠换一个观察角度
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 3:41:45

excel 导入 科学计数法问题处理

excel 导入科学计算发的处理 一般的导入都会有这个问题&#xff0c;类型转换的时候&#xff0c;用下面的代码public static String getCellValueAsString(Cell cell) {if (cell null) {return "";}switch (cell.getCellType()) {case STRING:return cell.getStringC…

作者头像 李华
网站建设 2026/4/17 21:35:50

static关键字

static关键字static关键字是什么static修饰变量static修饰方法static 修饰代码块类的加载顺序static关键字是什么 static 是 Java 中的修饰符&#xff0c;用于表示某个成员&#xff08;变量、方法、代码块、内部类&#xff09;属于类本身&#xff0c;而不是属于类的某个特定实…

作者头像 李华
网站建设 2026/4/11 14:29:37

机械革命笔记本开机卡Logo?3步强制修复指南

我的机械革命笔记本使用三年后突然无法正常开机&#xff0c;卡在Logo界面并提示自动修复。根据网友建议&#xff0c;尝试拔掉所有外接设备后确实成功开机&#xff0c;但该方法后续失效。于是尝试通过强制开机跳过自动修复&#xff0c;最终解决问题。 解决方法步骤如下&#xf…

作者头像 李华
网站建设 2026/4/18 5:13:15

江苏诚信的港澳台联考机构哪家专业

江苏诚信的港澳台联考机构哪家专业在江苏&#xff0c;随着越来越多的港澳台学子希望通过港澳台联考实现内地高校求学梦&#xff0c;选择一家专业诚信的港澳台联考机构变得至关重要。目前众多机构林立&#xff0c;上海心叶教育凭借多年积累的深厚底蕴和出色的教学成果脱颖而出&a…

作者头像 李华
网站建设 2026/4/18 5:13:13

软件缺少vfp9r.dll文件 无法启动运行问题 下载修复方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华