算法随笔_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 True
        return False    
                
            

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?

Jenkins在第一次进行登录的时候&#xff0c;只需要输入Jenkins\secrets\initialAdminPassword中的密码&#xff0c;登录成功后&#xff0c;本次我们没有修改密码&#xff0c;就会导致后面第二次登录&#xff0c;Jenkins需要进行用户名和密码的验证&#xff0c;但是我们根本就没…

【Arxiv 大模型最新进展】TOOLGEN:探索Agent工具调用新范式

【Arxiv 大模型最新进展】TOOLGEN&#xff1a;探索Agent工具调用新范式 文章目录 【Arxiv 大模型最新进展】TOOLGEN&#xff1a;探索Agent工具调用新范式研究框图方法详解 作者&#xff1a;Renxi Wang, Xudong Han 等 单位&#xff1a;LibrAI, Mohamed bin Zayed University o…

数据库内存与Buffer Pool

数据库内存与Buffer Pool 文章目录 数据库内存与Buffer Pool一&#xff1a;MySQL内存结构1&#xff1a;MySQL工作组件2&#xff1a;工作线程的本地内存3&#xff1a;共享内存区域4&#xff1a;存储引擎缓冲区 二&#xff1a;InnoDB的核心&#xff1a;Buffer Pool1&#xff1a;数…

[CVPR 2022]Cross-view Transformers for real-time Map-view Semantic Segmentation

论文网址&#xff1a;Cross-View Transformers for Real-Time Map-View Semantic Segmentation 论文代码&#xff1a;cross_view_transformers/cross_view_transformer at master bradyz/cross_view_transformers GitHub 英文是纯手打的&#xff01;论文原文的summarizing …

Java 中线程的使用

文章目录 Java 线程1 进程2 线程3 线程的基本使用&#xff08;1&#xff09;继承 Thread 类&#xff0c;重写 run 方法&#xff08;2&#xff09;实现 Runnable 接口&#xff0c;重写 run 方法&#xff08;3&#xff09;多线程的使用&#xff08;4&#xff09;线程的理解&#…

手撕Vision Transformer -- Day1 -- 基础原理

手撕Vision Transformer – Day1 – 基础原理 目录 手撕Vision Transformer -- Day1 -- 基础原理Vision Transformer (ViT) 模型原理1. Vit 网络结构图2. 背景3. 模型架构3.1 图像切块&#xff08;Patch Embedding&#xff09;3.2 添加位置编码&#xff08;Positional Encoding…

【AI】DeepSeek 概念/影响/使用/部署

在大年三十那天&#xff0c;不知道你是否留意到&#xff0c;“deepseek”这个词出现在了各大热搜榜单上。这引起了我的关注&#xff0c;出于学习的兴趣&#xff0c;我深入研究了一番&#xff0c;才有了这篇文章的诞生。 概念 那么&#xff0c;什么是DeepSeek&#xff1f;首先百…

Java锁自定义实现到aqs的理解

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 理解锁&#xff0c;能自定义实现锁通过自定义锁的实现复习Thread和Object的相关方法开始尝试理解Aqs, 这样后续基于Aqs的的各种实现将能更好的理解 目录 锁的…

html的字符实体和颜色表示

在HTML中&#xff0c;颜色可以通过以下几种方式表示&#xff0c;以下是具体的示例&#xff1a; 1. 十六进制颜色代码 十六进制颜色代码以#开头&#xff0c;后面跟随6个字符&#xff0c;每两个字符分别表示红色、绿色和蓝色的强度。例如&#xff1a; • #FF0000&#xff1a;纯红…

Golang 并发机制-1:Golang并发特性概述

并发是现代软件开发中的一个基本概念&#xff0c;它使程序能够同时执行多个任务&#xff0c;从而提高效率和响应能力。在本文中&#xff0c;我们将探讨并发性在现代软件开发中的重要性&#xff0c;并深入研究Go处理并发任务的独特方法。 并发的重要性 增强性能 并发在提高软…

three.js用粒子使用canvas生成的中文字符位图材质

three.js用粒子使用canvas生成中文字符材质 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Three.…

《逆向工程核心原理》第三~五章知识整理

查看上一章节内容《逆向工程核心原理》第一~二章知识整理 对应《逆向工程核心原理》第三章到第五章内容 小端序标记法 字节序 多字节数据在计算机内存中存放的字节顺序分为小端序和大端序两大类 大端序与小端序 BYTE b 0x12; WORD w 0x1234; DWORD dw 0x12345678; cha…

2025年数学建模美赛 A题分析(4)楼梯使用人数模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

【cocos creator】【模拟经营】餐厅经营demo

下载&#xff1a;【cocos creator】模拟经营餐厅经营

29.Word:公司本财年的年度报告【13】

目录 NO1.2.3.4 NO5.6.7​ NO8.9.10​ NO1.2.3.4 另存为F12&#xff1a;考生文件夹&#xff1a;Word.docx选中绿色标记的标题文本→样式对话框→单击右键→点击样式对话框→单击右键→修改→所有脚本→颜色/字体/名称→边框&#xff1a;0.5磅、黑色、单线条&#xff1a;点…

高性能消息队列Disruptor

定义一个事件模型 之后创建一个java类来使用这个数据模型。 /* <h1>事件模型工程类&#xff0c;用于生产事件消息</h1> */ no usages public class EventMessageFactory implements EventFactory<EventMessage> { Overridepublic EventMessage newInstance(…

neo4j初识

文章目录 一 图论基础二 柯尼斯堡七桥问题2.1 问题背景2.2 欧拉的解决3.1 核心概念3.2 核心优势3.3 应用场景3.4 技术特性3.5 版本与部署3.6 示例&#xff1a;社交关系查询3.7 限制与考量 四 图论与 Neo4j 的关联4.1 数据建模4.2 高效遍历4.3 应用场景 五 示例&#xff1a;用 N…

吴恩达深度学习——超参数调试

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 超参数调试调试选择范围 Batch归一化公式整合 Softmax 超参数调试 调试 目前学习的一些超参数有学习率 α \alpha α&#xff08;最重要&#xff09;、动量梯度下降法 β \bet…

行业规范要当作业务实体画出来吗

第五元素 总觉得这些没有逻辑的实体&#xff0c;在绘制的时候不应该绘出来&#xff0c;他们没有责任啊。 比如以下:查阅规范 感觉不太对 UMLChina潘加宇 你这个规范是一个电脑系统还是一本书 第五元素 是书 UMLChina潘加宇 书没有智能&#xff0c;唯一暴露的接口是“翻”…

冯·诺依曼体系结构

目录 冯诺依曼体系结构推导 内存提高冯诺依曼体系结构效率的方法 你使用QQ和朋友聊天时&#xff0c;整个数据流是怎么流动的&#xff08;不考虑网络情况&#xff09; 与冯诺依曼体系结构相关的一些知识 冯诺依曼体系结构推导 计算机的存在就是为了解决问题&#xff0c;而解…