leetcode:递增的三元子序列

news2024/11/25 7:10:04

递增的三元子序列

题解部分转自leetcode:Xzz

medium

给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false

示例 1:

输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意

示例 2:

输入:nums = [5,4,3,2,1]
输出:false
解释:不存在满足题意的三元组

示例 3:

输入:nums = [2,1,5,0,4,6]
输出:true
解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

**进阶:**你能实现时间复杂度为 O(n) ,空间复杂度为 O(1) 的解决方案吗?

一、题目信息剖析
划重点:给定一个 未排序 的数组,判断这个数组中是否 存在 长度为 3 的 递增 子序列。

所以我们优化算法的根本来源在于抓住 存在 和 长度为3 这个重点进行优化。

题目只需要我们判断存在即可,所以我们只需要找出一个满足题意的条件即可。

要求:O(n)O(n)O(n)的时间复杂度,即遍历一遍数组,要求O(1)O(1)O(1)的空间复杂度,即不使用额外空间。

二、思路详解
核心想法:遍历一遍数组,希望遍历到的这个数three,前面已经有一个比他小的数two,再前面有一个比two小的数one。 我们需要维护两个变量:onetwo。代表递增子序列的第一个数和第二个数。 假设我们已经有了这两个数,那么three的大小有以下三种情况:

  1. three大于two
image-20230711110317196

此情况下:即找到了三元组,直接返回true。

  1. three介于two和one之间

(three<=two && three>one)

image-20230711110349485

此情况下:应更新two,赋值为这个更小的值。 这相当于帮我们扩大了three的可选择范围,当再次遇到一个比更新过的two大的数即可找到。

image-20230711110420454
  1. three小于one
image-20230711110628142

此情况下:应更新one,赋值为这个更小的值。而不需要动two。 这相当于帮我们扩大了之后出现的two的可选择范围。进而扩大了之后出现的three的可选择范围。

image-20230711110729751

需要注意的是,我们只更新one,原先的two不需要更改,因为子序列是从前往后的,只有当之后再出现比two小的数的时候再按照第二步那样更改。

假设有如下示例:[2,5,1,6],在遇到1之后更新了one,后遇到6,因为先判断是否大于two,由于6大于5,就直接返回true了。

image-20230711110800395

注意:two附带隐含信息——这之前有个数比two小 所以此时找到的递增子序列不是one、two、three的1 5 6,而是old one、two、three的2 5 6。

这里更新的one的意思是,为之后可能存在的更小的递增子序列打基础。 假设有如下示例:[2,5,1,2,6],在遇到1之后更新了one,后遇到2,2介于1和5(two)之间,更新two为2,后遇到6,由于6大于2,返回true。 此时找到的递增子序列才是one、two、three的1 2 6

最后考虑one、two的初值,容易想到设定为Integer.MAX_VALUE (float(“inf”) 正无穷大即可。

三、代码

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        one = two = float('inf') # 初始化子序列第一个数和第二个数为正无穷大
        for three in nums:#子序列第三个数遍历数组
            if three > two:# 第三个数大于第二个数则存在一个递增
                return True

            elif three <= one:# 第三个数小于等于第一个数,将第三个数赋值给第一个数
                one = three
            
            elif three > one and three <= two:# 第三个数大于第一个数并且小于等于第二个数时,将第三个数赋值给第二个数
                two = three
                
        return False# 遍历完成没有找到符合的递增序列返回False

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

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

相关文章

专享策略06 | 盘口策略CTP实盘版

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 大家好&#xff0c;我们在6月29日发布了盘口策略| 回测版&#xff0c;今天我们做好了CTP的实盘版本供俱乐部会员使用和玩耍&#xff0c;今天主要说明一下如何使用CTP实盘版本。 先回顾一…

线上展厅设计方案,个性化自主打造720漫游展厅

导语&#xff1a; 随着科技的不断进步&#xff0c;线上展厅作为一种新型的展示方式&#xff0c;在现代社会得到了广泛的应用。线上展厅通过虚拟技术和创新设计&#xff0c;突破了时间和地域的限制&#xff0c;为企业和观众带来了全新的展览体验。本文将重点探讨线上展厅的优势和…

【工具使用】STM32CubeMX-单ADC模式规则通道配置

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片的ADC的配置及其相关知识。 二、…

6. Springboot快速回顾(集成Dubbo)

Dubbo是实现远程调用的一个框架&#xff0c;阿里巴巴开源的。远程调用就是B服务器可以调用A服务器的方法。大型项目会被拆分成多个模块&#xff0c;部署在不同的服务器上。若将公共模块集中部署在一台服务器上&#xff0c;可以方便其他服务器调用。因此&#xff0c;需要Dubbo。…

java代码实现自动录入数据

之前工作中遇到粘贴复制大量数据&#xff0c;研究一下java代码解放双手 模拟鼠标录入数据 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.0.RELEASE&…

本地私有化部署大模型RWKV-懒人包一键安装享受专属免费大模型-RWKV Runner

仓库地址&#xff1a;https://github.com/josStorer/RWKV-Runner 预设配置已经开启自定义CUDA算子加速&#xff0c;速度更快&#xff0c;且显存消耗更少。如果你遇到可能的兼容性问题&#xff0c;前往配置页面&#xff0c;关闭使用自定义CUDA算子加速 如果Windows Defender说这…

Flutter:架构概览

概览 Flutter本质上是一个跨平台的UI工具集&#xff0c;允许在各自操作系统上复用同样的代码。 尽可能提供原生体验的高性能和复用代码。 开发中&#xff0c;Flutter应用在一个VM上运行&#xff0c;使得可在保留状态且无需重新编译情况下&#xff0c;进行热加载。 发行时&…

【教程】Unity 联动 MSMQ 消息通讯

开发平台&#xff1a;Unity 2021.3.7 通讯平台&#xff1a;Windows 10 依赖DLL&#xff1a;System.Messaging.dll   一、本文目标 了解与操作 Windows 平台上建立 Unity 与 MSMQ 通讯机制。实现基础的通讯功能。   二、准备&#xff1a;启用 MSMQ 服务项 注意&#xff1a;默…

操作符——区别C++前置++和后置++

这里写目录标题 1.问题引出Q:重载或者--的时候如何区分前置和后置&#xff1f; 2.C规范3.前后置实现4.为什么i;可以 i&#xff1b;不行 1.问题引出 Q:重载或者–的时候如何区分前置和后置&#xff1f; 以前C对前置和后置没有很好的办法可以区分&#xff0c;为了解决这个问题&…

面试之SpringAOP的理解:

AOP(面向切面编程)指的是那些业务本身无关&#xff0c;但是被业务模块所共同调用的业务逻辑或责任&#xff08;日志管理&#xff0c;权限管理等&#xff09;封装起来&#xff0c;便于减少系统的重复代码&#xff0c;降低系统见的耦合性&#xff0c;有利于未来系统的扩展性。 S…

IOS开发工程师的发展前景怎么样

本文目录一览 1&#xff0c;iOS开发工程师就业前景怎么样2&#xff0c;北大青鸟java培训IOS开发前景怎么样3&#xff0c;iOS开发工程师就业前景怎么样4&#xff0c;作为一个iOS开发程序员我的未来何去何从5&#xff0c;IOS开发工程师的发展前景怎么样6&#xff0c;ios开发工程…

Ubuntu 20.04 L2TP VPN 自动重连脚本,cron定时任务设置

1、连接VNP脚本 reconnect_l2tp_vpn.sh #!/bin/sh ppp0_flagifconfig | grep ppp0 echo $ppp0_flag if [ -z "$ppp0_flag" ];thenecho "connet to vpn ..."# connet vpn# echo PASSWORD &#xff5c; sudo -S 这样可以不用手动输入密码!echo abc123| su…

我爱学QT-QT信号和槽

1.给控件改名字 为了分析代码方便&#xff0c;我们要给控件改名字。要通俗易懂。 2.信号和槽 信号&#xff1a;信号就是指控件发出的特定的信号。 比如按钮的信号 槽&#xff1a;槽就是槽函数的意思&#xff0c;我们可以把槽函数绑定在某一个控件的信号上。 3.怎么关联信号…

IntelliJ IDEA中生成jar包并运行

1. 过程 依次选择菜单&#xff1a;File->Project Structure…&#xff0c;打开“Project Structure”界面。 在打开界面的左侧列表中选择&#xff1a;Artifacts&#xff0c;点击右侧出现的号。 在出现的菜单中依次选择&#xff1a;JAR->From modules with dependencies…

家政行业丨制作便捷高效的家政小程序

随着现代生活节奏的加快和家庭需求的多样化&#xff0c;越来越多的人开始寻找一种更方便、更高效的方式来获取家政服务。而家政小程序的兴起为这一需求提供了理想的解决方案。本文将简要介绍家政小程序是什么&#xff0c;探讨家政小程序的好处&#xff0c;并提供一些制作搭建家…

element上传文件对格式限制的处理

需求&#xff1a;上传的文件格式必须是pdf格式&#xff0c;方便查看 规定多种格式用逗号隔开 使用这个属性可以规定上传文件格式&#xff0c;但是有bug 可以手动改变显示的文件类型&#xff0c;还是可以传其他文件类型 所以需要在上传的时候限制上传的文件格式 上传组件 <…

X2000 Linux 调试VL53L4CD

由于VL53L4CD具有更高的精度&#xff0c;更低的功耗&#xff0c;所以尝试将VL53L4CD移植到X2000上进行测试。 一、下载驱动 en.VL53L4CD_LinuxDriver 二、SDK中加入驱动 1、加入源码 在\module_driver\devices下创建VL53L4CD文件夹&#xff0c;再将\en.VL53L4CD_LinuxDriver…

网络爬虫-jd滑块验证码

仅供研究学习使用。 目标站点 --> 京东网页登录 当我们输入账号密码后&#xff0c;点击登录&#xff0c;首先映入眼帘的是一个滑块&#xff0c;那我们先分析一下滑块吧。 上图是滑块的有关信息&#xff0c;左边的横线是请求的url&#xff0c;右边是参数&#xff0c;很显然&…

敏捷测试自动化

目录 前言&#xff1a; 敏捷宣言 敏捷软件开发VS传统方法 敏捷云服务 对什么进行自动化&#xff1f; 测试自动化的技巧 关于敏捷测试和自动化测试的关键信息 前言&#xff1a; 敏捷测试自动化是在敏捷开发环境中使用自动化工具和技术来支持测试活动的一种方法。它旨在提…

SQL使用(一):如何使用SQL语句去查询第二高的值

今天刷MYSQL题的时候刷到这样一个题&#xff1a; 编写一个 SQL 查询&#xff0c;获取 Employee 表中第二高的薪水&#xff08;Salary&#xff09; 。------------| Id | Salary |------------| 1 | 100 || 2 | 200 || 3 | 300 |------------例如上述 Employee 表&a…