当前位置: 首页 > article >正文

算法随笔_33: 132模式

上一篇:算法随笔_32: 移掉k位数字-CSDN博客

=====

题目描述如下:

给你一个整数数组 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] 。

=====

算法思路:

根据题目要求,我们从右往左枚举数组,尝试找到题解中的元素i。由于是从右往左遍历,因此,j,k必然是从已经访问过的元素里寻找。如果能找到符合条件的j,k,那么我们就找到了一组解。让我们通过下面一步一步的推理来找出这道题的特征,从而写出高效的算法。为了方便描述我们假设一个数组为20个元素。此假设并不影响对这道题一般性特征的提取。

1.  首先,末尾元素nums[19]做为题解的nums[i],是不可能的。排除它是i的可能,但它有可能是k,因此我们需要把它存下来。我们把它放入一个新数组stck中。为了做为未来nums[k]的候选。

2.  假设nums[18]到nums[10]数值依次递减。那么任何一个值都不可能是题解中的元素i。这个现象比较明显,此处不做证明。我们把它们依次放入stck中。stck最后一个值stck[-1]为nums[10]。python语言中,数组的索引-1表示倒数第一个,-2表示倒数第二个。以此类推。下面沿用此方式来进行描述。

3.  第一次升高在nums[9]处,即,nums[9]大于stck[-1](nums[10])或其他。此时它也不可能为nums[i],因为它后面的元素在原数组中是递增的,不可能找到nums[j]>nums[k]。此时我们如何更新这个stck数组呢?

先给结论1: 我们在stck中删除所有小于nums[9]的元素。把小于nums[9]的最大元素,比如nums[12]存入另一个变量k_max中。然后nums[9]放入stck中。此时stck中为[19, 18,17,16,15,14,13,9], k_max=nums[12]

这里有两个点需要咱重点关注一下:

a. stck仍然保持一个递减的状态。

b. 基于原数组的顺序,k_max这个元素之前有个比它大的元素nums[9]。

这两点很重要。

接下来我们证明一下为什么可以这样做,并且不影响最后的结果。

假设元素nums[11]能成为题解的nums[k],那么在nums[9]之前必然有个nums[i]小于nums[11],那么nums[i],nums[9],k_max(即nums[12])也能成为一个题解。其他被删除的元素也是如此。所以删除它们,并不影响结果。

4.  让我们继续向左遍历,我们来到了nums[8]。此时会有两种情况:

a.  如果nums[8]大于stck[-1](值为nums[9]),按照结论1的方式操作stck和k_max值。即,删除stck中所有小于nums[8]的元素。把小于nums[8]的最大元素,如nums[15],存入k_max中。然后nums[8]放入stck中。此时stck中为[19, 18,17,16,8], k_max=nums[15]。此操作也不会影响最终结果。此证明类似结论1的证明,这里咱在解释一遍,加深一遍印象。

假设nums[14]为题解中的nums[k],在nums[8]之前的某个元素nums[i]可以和nums[14]构成一个题解,那么nums[i]也可以和nums[8],nums[15]构成一个题解。因为nums[i]小于nuns[14],而nums[14]又小于nums[15]。

b.  如果nums[8]小于stck[-1](值为nums[9]),,我们能放入数组吗?这里又出现两种情况: 如果它小于k_max。那此时我们已经找到了一个题解。如果大于k_max,那么就放入stck,做为候选。此时stck仍然保持一个递减的状态。

到此,我们基本就可以发现规律了。当我们继续向左遍历,仍然遵循第3,4点,维护stck和k_max变量。直到枚举完成。

我们再补充解释几个细节:

1.  对于上面提到的第2,3点,如果在放入1个元素后就出现升高,也是符合这个规律的。大家可以自行推导一下。

2. 变量k_max也有两个特征:

a.  按照原数组的顺序,它前面始终有一个比它大的元素。

b.  存入它的元素都比它的当前值大。

此算法的时间复杂度为O(n)。下面是代码实现:

class Solution(object):def find132pattern(self, nums):""":type nums: List[int]:rtype: bool"""stck=[nums[-1]]k_max=float("-inf")nums_len=len(nums)for i in range(nums_len - 2, -1, -1):while len(stck)>0 and nums[i]>stck[-1]:k_max=stck[-1]stck.pop()if nums[i] >= k_max:stck.append(nums[i])else:return Truereturn False    

这篇文章通过对一个具体实例的分析,一步一步的对这道算法题的单调栈的解法给大家做了较为深入的剖析。希望能对大家理解它背后的原理有所帮助。

相关文章:

算法随笔_33: 132模式

上一篇:算法随笔_32: 移掉k位数字-CSDN博客 题目描述如下: 给你一个整数数组 nums &#xff0c;数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成&#xff0c;并同时满足&#xff1a;i < j < k 和 nums[i] < nums[k] < nums[j…...

Linux内核中的页面错误处理机制与按需分页技术

在现代操作系统中,内存管理是核心功能之一,而页面错误(Page Fault)处理机制是内存管理的重要组成部分。当程序访问一个尚未映射到物理内存的虚拟地址时,CPU会触发页面错误异常,内核需要捕获并处理这种异常,以决定如何响应,例如加载缺失的页面、处理权限错误等。Linux内…...

【Git】使用笔记总结

目录 概述安装Git注册GitHub配置Git常用命令常见场景1. 修改文件2. 版本回退3. 分支管理 常见问题1. git add [中文文件夹] 无法显示中文问题2. git add [文件夹] 文件名中含有空格3. git add 触发 LF 回车换行警告4. git push 提示不存在 Origin 仓库5. Git与GitHub中默认分支…...

C语言中的存储类

C语言中的存储类 在C语言中&#xff0c;存储类是用于定义变量和函数的作用域、生命周期以及可见性的关键字。存储类决定了数据在内存中的存储位置以及它们在程序中的使用方式。本文将详细介绍C语言中的存储类&#xff0c;包括其类型、作用以及如何使用。 1. 存储类的类型 C语…...

DeepSeek 云端部署,释放无限 AI 潜力!

1.简介 目前&#xff0c;OpenAI、Anthropic、Google 等公司的大型语言模型&#xff08;LLM&#xff09;已广泛应用于商业和私人领域。自 ChatGPT 推出以来&#xff0c;与 AI 的对话变得司空见惯&#xff0c;对我而言没有 LLM 几乎无法工作。 国产模型「DeepSeek-R1」的性能与…...

【Qt5】声明之后快速跳转

我在网上看到的方法是ctrlL&#xff08;&#xff1f;不是很清楚&#xff0c;因为我跳转不成功&#xff01;&#xff09; 另外一种就是鼠标点击跳转的。 首先&#xff0c;声明私有成员函数 此时&#xff0c;一般步骤应该是在构造函数里面继续&#xff0c;写函数的框架什么的。于…...

flowable expression和json字符串中的双引号内容

前言 最近做项目&#xff0c;发现了一批特殊的数据&#xff0c;即特殊字符"&#xff0c;本身输入双引号也不是什么特殊的字符&#xff0c;毕竟在存储时就是正常字符&#xff0c;只不过在编码的时候需要转义&#xff0c;转义符是\&#xff0c;然而转义符\也是特殊字符&…...

新一代搜索引擎,是 ES 的15倍?

Manticore Search介绍 Manticore Search 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx&#xff0c;显着改进了它的功能&#xff0c;修复了数百个错误&#xff0c;几乎完全重写了代码…...

Pandas基础06(异常值的检测与过滤/抽样/常用聚合函数/数据聚合)

Pandas基础06 异常值的检测与过滤 在数据分析中&#xff0c;异常值&#xff08;Outliers&#xff09;是指与其他数据点显著不同的值。这些值可能由于数据录入错误、设备故障或极端情况而产生&#xff0c;因此在进行数据分析之前&#xff0c;需要对其进行检测与过滤。本文将介绍…...

事务01之事务机制

事务机制 文章目录 事务机制一&#xff1a;ACID1&#xff1a;什么是ACID2&#xff1a;MySQL是如何实现ACID的 二&#xff1a;MySQL事务机制综述1&#xff1a;手动管理事务2&#xff1a;事务回滚点3&#xff1a;事务问题和隔离机制&#xff08;面试&#xff09;3.1&#xff1a;事…...

Python-基于mediapipe,pyautogui,cv2和numpy的电脑手势截屏工具(进阶版)

前言:在我们的日常生活中,手机已经成为我们每天工作,学习,生活的一个不可或缺的部分。众所周知:为了我们的使用方便,手机里面的很多功能非常人性化,既便捷又高效,其中就有手机的截屏方式,它们花样繁多,如三指截屏,手势截屏等。那么怎么在电脑里面也实现这个功能呢?…...

@EventListener底层原理(超详细)| @TransactionalEventListener底层原理 | 事务同步

0. 举个栗子0.1. 事件监听方法0.2. 事件推送 1. EventListener注解2. EventListener标注的监听方法解析2.1. 事件监听方法处理器EventListenerMethodProcessors2.1.1. AbstractApplicationContext.invokeBeanFactoryPostProcessors2.1.2. AbstractApplicationContext.initAppli…...

NX/UG二次开发—CAM—快速查找程序参数名称

使用UF_PARAM_XXX读取或设置参数时,会发现程序中有一个INT类型参数param_index,这个就是对应程序中的参数,比如读取程序余量,则param_index = UF_PARAM_STOCK_PART,读取程序的加工坐标系则param_index = UF_PARAM_MCS等等。 你需要读取什么参数,只要只能在uf_param_indic…...

X86路由搭配rtl8367s交换机

x86软路由&#xff0c;买双网口就好。或者单网口主板&#xff0c;外加一个pcie千兆。 华硕h81主板戴尔i350-T2双千兆&#xff0c;做bridge下载&#xff0c;速度忽高忽低。 今天交换机到货&#xff0c;poe供电&#xff0c;还是网管&#xff0c;支持Qvlan及IGMP Snooping&#xf…...

【C++语言】卡码网语言基础课系列----5. A+B问题VIII

文章目录 练习题目AB问题VIII具体代码实现 小白寄语诗词共勉 练习题目 AB问题VIII 题目描述&#xff1a; 你的任务是计算若干整数的和。 输入描述&#xff1a; 输入的第一行为一个整数N&#xff0c;接下来N行每行先输入一个整数M&#xff0c;然后在同一行内输入M个整数。 输出…...

【LLM-agent】(task1)简单客服和阅卷智能体

note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板&#xff0c;某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链&#xff1a;Role (角色) -> Profile&#xff08;角色…...

CAP 定理的 P 是什么

分布式系统 CAP 定理 P 代表什么含义 作者之前在看 CAP 定理时抱有很大的疑惑&#xff0c;CAP 定理的定义是指在分布式系统中三者只能满足其二&#xff0c;也就是存在分布式 CA 系统的。作者在网络上查阅了很多关于 CAP 文章&#xff0c;虽然这些文章对于 P 的解释五花八门&am…...

RK3568使用opencv(使用摄像头捕获图像数据显示)

文章目录 一、opencv相关的类1. **cv::VideoCapture**2. **cv::Mat**3. **cv::cvtColor**4. **QImage**5. **QPixmap**总结二、代码实现一、opencv相关的类 1. cv::VideoCapture cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者图像序列中捕…...

ZZNUOJ(C/C++)基础练习1021——1030(详解版)

目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 &#xff08;C语言版&#xff0c;三目运算&#xff09;C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…...

2025 年,链上固定收益领域迈向新时代

“基于期限的债券市场崛起与 Secured Finance 的坚定承诺” 2025年&#xff0c;传统资产——尤其是股票和债券——大规模涌入区块链的浪潮将创造历史。BlackRock 首席执行官 Larry Fink 近期在彭博直播中表示&#xff0c;代币化股票和债券将逐步融入链上生态&#xff0c;将进一…...

使用where子句筛选记录

默认情况下,SearchCursor将返回一个表或要素类的所有行.然而在很多情况下,常常需要某些条件来限制返回行数. 操作方法: 1.打开IDLE,加载先前编写的SearchCursor.py脚本 2.添加where子句,更新SearchCursor()函数,查找记录中有<>文本的<>字段 with arcpy.da.Searc…...

基于互联网+智慧水务信息化整体解决方案

智慧水务的概述与发展背景 智慧水务是基于互联网、云计算、大数据、物联网等先进技术&#xff0c;对水务行业的工程建设、生产管理、管网运营、营销服务及企业综合管理等业务进行全面智慧化管理的创新模式。它旨在解决水务企业分散经营、管理水平不高、投资不足等问题。 水务…...

FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型

void initUser(User user); } 2、执行命令./gradlew assembleDebug&#xff0c;生成IUserServiceStub类和fidl.json文件 3、打开通道&#xff0c;向Flutter公开方法 FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), new IUserServiceStub() { Override void…...

文件读写操作

写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式&#xff1a;1.ios::out、ios::trunc 清除文件内容后打开2.ios:…...

cf1000(div.2)

Minimal Coprime最小公倍数 输入&#xff1a; 6 1 2 1 10 49 49 69 420 1 1 9982 44353 输出&#xff1a; 1 9 0 351 1 34371 代码...

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟&#xff1a;生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…...

jhat命令详解

jhat 命令通常与 jmap 搭配使用&#xff0c;用来分析 jmap 生成的 dump 文件&#xff0c;jhat 内置了一个微型的HTTP/HTML服务器&#xff0c;生成 dump 的分析结果后&#xff0c;可以在浏览器中查看。 命令的使用格式如下。&#xff08;其中heap-dump-file为必填项&#xff09…...

FFmpeg(7.1版本)的基本组成

1. 前言 FFmpeg 是一个非常流行的开源项目,它提供了处理音频、视频以及其他多媒体内容的强大工具。FFmpeg 包含了大量的库,可以用来解码、编码、转码、处理和播放几乎所有类型的多媒体文件。它广泛用于视频和音频的录制、转换、流媒体传输等领域。 2. FFmpeg的组成 1. FFmp…...

DDD - 领域驱动设计分层架构:构建可演化的微服务架构

文章目录 引言1. 什么是DDD分层架构&#xff1f;1.1 DDD分层架构的演变1.2 四层架构的起源与问题1.3 依赖倒置和五层架构 2. DDD分层架构的核心层次2.1 用户接口层&#xff08;User Interface Layer&#xff09;2.2 应用层&#xff08;Application Layer&#xff09;2.3 领域层…...

大数据挖掘--两个角度理解相似度计算理论

文章目录 0 相似度计算可以转换成什么问题1 集合相似度的应用1.1 集合相似度1.1文档相似度1.2 协同过滤用户-用户协同过滤物品-物品协同过滤 1.2 文档的shingling--将文档表示成集合1.2.1 k-shingling1.2.2 基于停用词的 shingling 1.3 最小哈希签名1.4 局部敏感哈希算法&#…...