LeetCode题练习与总结:132 模式--456

一、题目描述

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

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

示例 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 <= 2 * 10^5
  • -10^9 <= nums[i] <= 10^9

二、解题思路

要解决这个问题,我们可以使用一个单调栈来帮助我们找到满足132模式的子序列。以下是解题思路:

  1. 从后向前遍历数组,维护一个单调递减栈,栈中存储的是数组元素的索引。
  2. 使用一个变量third来记录当前遍历到的元素作为nums[k]时,所有可能的nums[i]中的最大值。
  3. 当遍历到一个元素nums[j]时,如果third不为空且nums[j] > third,则说明找到了一个满足条件的子序列,返回true
  4. 如果当前元素nums[j]小于栈顶元素对应的值,则将栈顶元素弹出,并更新third为弹出的元素值,因为此时弹出的元素可以作为nums[k],而nums[j]可以作为nums[j],我们记录下nums[k]中的最大值作为third
  5. 将当前元素的索引压入栈中。
  6. 如果遍历完数组仍未找到满足条件的子序列,则返回false

三、具体代码

class Solution {public boolean find132pattern(int[] nums) {if (nums == null || nums.length < 3) {return false;}// 单调栈,存储的是元素的索引Stack<Integer> stack = new Stack<>();// third变量记录所有可能的nums[i]中的最大值int third = Integer.MIN_VALUE;// 从后向前遍历数组for (int i = nums.length - 1; i >= 0; i--) {// 如果当前元素小于third,说明找到了132模式if (nums[i] < third) {return true;}// 当栈不为空且当前元素大于栈顶元素时,更新thirdwhile (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {third = nums[stack.pop()];}// 将当前元素的索引压入栈中stack.push(i);}// 如果遍历完数组仍未找到满足条件的子序列,则返回falsereturn false;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历数组:我们使用了一个for循环来遍历数组中的每个元素,这个操作的时间复杂度是O(n),其中n是数组的长度。
  • 栈操作:在每次遍历中,每个元素最多只会被压入栈一次,并且最多也只会被弹出一次。因此,整个数组遍历过程中,每个元素最多只会经过栈两次(一次入栈,一次出栈),这意味着栈相关的操作的总时间复杂度也是O(n)。

由于这两个操作是顺序执行的(遍历数组和栈操作是同时进行的),所以总的时间复杂度是O(n)。

2. 空间复杂度
  • 栈空间:在最坏的情况下,如果数组是单调递增的,那么所有元素都会被压入栈中。因此,栈的空间复杂度是O(n),其中n是数组的长度。
  • 辅助空间:除了栈之外,我们只使用了一个额外的变量third来存储中间值,这个变量占用的空间是常数级的,即O(1)。

因此,总的空间复杂度是O(n),由栈的大小决定。

五、总结知识点

  • 数组遍历

    • 使用for循环从后向前遍历数组,这是为了能够利用栈来维护一个单调递减的序列。
  • 栈(Stack)的使用

    • 使用Java的Stack类来存储数组元素的索引,栈在这里用于维护一个单调递减的序列,帮助我们找到可能的nums[k]
  • 条件判断

    • 使用if语句来判断是否找到了132模式的子序列。
    • 使用while循环来处理栈中元素,当栈不为空且当前元素大于栈顶元素时,更新third变量。
  • 最小值初始化

    • 使用Integer.MIN_VALUE来初始化third变量,确保在比较时能够正确地更新third为更大的值。
  • 栈的基本操作

    • push():将元素压入栈中。
    • pop():从栈中弹出元素。
    • peek():查看栈顶元素而不弹出。
  • 返回值

    • 方法返回一个布尔值,表示是否找到了132模式的子序列。
  • 边界条件检查

    • 在方法开始时检查输入数组是否为空或长度小于3,因为至少需要3个元素才能形成132模式。
  • 整数比较

    • 在代码中多次进行了整数比较,这是基本的编程操作。
  • 逻辑推理

    • 整个算法的设计基于对132模式的理解,以及如何通过栈来维护一个潜在的有效序列,这是算法的核心。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(5)JS-Clipper2之PolyNode

1. 描述 PolyNodes是被封装在PolyTree的容器中&#xff0c;同时提供了一个数据结构来代表由Excute()方法返回的多边形轮廓中的父子关系。 一个PolyNode对象代表一个多边形&#xff1b;它的“IsHole”属性表明它是一个“外轮廓”还是一个“内孔”&#xff0c;PolyNodes可能包含…

为什么 JavaScript 中的回调函数未按顺序执行?

在 JavaScript 中&#xff0c;回调函数未按顺序执行的原因&#xff0c;通常是由于 JavaScript 的 异步非阻塞 执行模型。JavaScript 在执行异步操作时&#xff0c;会将回调函数推入 任务队列&#xff0c;并不会立即执行这些回调函数&#xff0c;而是要等到主线程执行完同步任务…

Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;租房市场日益繁荣&a…

图像处理插件:让小程序焕发视觉新生的秘密武器

在小程序开发中&#xff0c;图像处理是一个重要的环节&#xff0c;它涉及到图片的加载、显示、裁剪、压缩等多个方面。为了简化这一复杂过程&#xff0c;开发者通常会使用图像处理插件。这些插件不仅提供了丰富的图像处理功能&#xff0c;还封装了底层的图像操作逻辑&#xff0…

MATLAB稀疏感知图像和体数据恢复的系统对象研究

稀疏感知图像和体数据恢复是一种用于恢复损坏、噪声或不完整的图像和体数据的技术。它利用了信号的稀疏性&#xff0c;即信号在某种基础下可以用较少的非零系数表示&#xff0c;从而实现高质量的恢复。 在进行稀疏感知图像和体数据恢复的研究时&#xff0c;需要定义一些系统对…

安卓调试环境搭建

前言 前段时间电脑重装了系统&#xff0c;最近准备调试一个apk&#xff0c;没想到装环境的过程并不顺利&#xff0c;很让人火大&#xff0c;于是记录一下。 反编译工具下载 下载apktool.bat和apktool.jar 官网地址&#xff1a;https://ibotpeaches.github.io/Apktool/install…

【工具】音频文件格式转换工具

找开源资源、下载测试不同库的效果&#xff0c;然后找音频、下载音频、编写代码、测试转换、流程通畅。写一个工具花的时间越来越多了&#xff01;这个 5 天 这个工具是一个音频文件格式转换工具&#xff0c;支持对 mp3.aac.wav.caf.flac.ircam.mp2.mpeg.oga.opus.pcm.ra.spx.…

在ARM Linux应用层下使用SPI驱动WS2812

文章目录 1、前言2、结果展示3、接线4、SPI驱动WS2812原理4.1、0码要发送的字节4.2、1码要发送的字节4.3、SPI时钟频率 5、点亮RGB5.1、亮绿灯5.2、亮红灯5.3、亮蓝灯5.4、完整程序 6、RGB呼吸灯7、总结 1、前言 事情是这样的&#xff0c;前段时间&#xff0c;写了一个基于RK3…

BERT:用于语言理解的深度双向 Transformer 的预训练。

文章目录 0. 摘要1. 介绍2. 相关工作2.1 无监督的基于特征的方法2.3 无监督微调方法2.3 从受监督数据中迁移学习 3. BERT3.1 预训练 BERT3.2 微调 BERT 4. 实验4.1 GLUE4.2 SQuAD v1.14.3 SQuAD v2.04.4 SWAG 5. 消融研究5.1 预训练任务的影响5.2 模型大小的影响5.3 使用 BERT …

在算网云平台云端在线部署stable diffusion (0基础小白超详细教程)

Stable Diffusion无疑是AIGC领域中的AI绘画利器&#xff0c;具有以下显著优势&#xff1a; 1、开源性质&#xff0c;支持本地部署 2、能够实现对图像生成过程的精确控制 虽然SD在使用上有很多的有点&#xff0c;但缺点也是不言而喻的&#xff0c;由于AI绘画的整个过程以及现…

设计模式——Chain(责任链)设计模式

摘要 责任链设计模式是一种行为设计模式&#xff0c;通过链式调用将请求逐一传递给一系列处理器&#xff0c;直到某个处理器处理了请求或所有处理器都未能处理。它解耦了请求的发送者和接收者&#xff0c;允许动态地将请求处理职责分配给多个对象&#xff0c;支持请求的灵活传…

macOS 15.1.1 (24B2091) 系统中快捷键符号及其代表的按键的对照表

以下是 macOS 15.1.1 (24B2091) 系统中快捷键符号及其代表的按键的对照表&#xff1a; 符号按键名称描述⌘Command (Cmd)常用的功能键&#xff0c;用于执行大多数快捷操作。⌥Option (Alt)Option 键&#xff0c;常用于辅助操作和特殊字符输入。⇧ShiftShift 键&#xff0c;常用…

el-table一键选择全部行,切换分页后无法勾选

el-table一键全选&#xff0c;分页的完美支持 问题背景尝试解决存在问题问题分析 解决方案改进思路如下具体代码实现如下 问题背景 现在有个需求&#xff0c;一个表格有若干条数据(假设数量大于20&#xff0c;每页10条&#xff0c;保证有2个以上分页即可)。 现在需要在表格上方…

【55 Pandas+Pyecharts | 实习僧网Python岗位招聘数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 调整部分城市名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 招聘数量前20岗位3.2 各城市招聘数量3…

JAVA期末复习(30道填空题梳理知识点)

通过梳理一些常见的填空题&#xff0c;有效地复习知识点&#xff0c;帮助大家顺利通过考试。本文将总结30道典型的填空题&#xff0c;并分析其中涉及的知识点。 一、基本语法 JAVA程序的入口方法是&#xff1a; public static void main(String[] args) { }这个题目考察了JAVA…

C++11新特性之线程std::thread

C std::thread的定义和功能 std::thread是C11引入的标准库类&#xff0c;用于创建和管理线程。通过std::thread&#xff0c;程序可以并发执行多个任务&#xff0c;从而提高效率。 功能与作用&#xff1a; 创建线程&#xff1a;可以启动一个线程执行某个函数或任务。管理线程…

【赵渝强老师】PostgreSQL的控制文件

PostgreSQL数据库的物理存储结构主要是指硬盘上存储的文件&#xff0c;包括&#xff1a;数据文件、日志文件、参数文件、控制文件、WAL预写日志文件等等。 下面重点讨论一下PostgreSQL的控制文件。 视频讲解如下 【赵渝强老师】PostgreSQL的控制文件 控制文件记录了数据库运行…

在做题中学习(79):最小K个数

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogK)&#xff0c;K为k个元素 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#…

【linux】shell(32)-循环控制

for循环 在 Shell 脚本中&#xff0c;for 循环是一种常见的循环结构&#xff0c;用于遍历列表、数组或命令输出。 基本语法 for 循环的基本语法如下&#xff1a; #!/bin/bash for variable in list docommands donevariable 是一个临时变量&#xff0c;用于存储每次迭代中的…

Pydantic 动态字段:使用和不使用 `@computed_field` 的对比指南

Pydantic 动态字段&#xff1a;使用和不使用 computed_field 的对比指南 安装 Pydantic不使用 computed_field 的实现特性 使用 computed_field 的实现特性 使用和不使用 computed_field 的对比适用场景分析什么时候不需要 computed_field&#xff1f;什么时候使用 computed_fi…