leetcode 334. 递增的三元子序列

这道LeetCode题目要求在未排序数组中寻找长度为3的递增子序列,要求时间复杂度为O(n),空间复杂度为O(1)。解决方案包括使用first和second变量来记录当前找到的最小值和次大值,通过遍历数组更新这两个变量,并在找到符合条件的三元子序列时返回true。官方解法更为巧妙,直接在循环中开始寻找递增子序列,优先更新first,然后才考虑second。
摘要由CSDN通过智能技术生成

334. 递增的三元子序列
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。

数学表达式如下:

如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。

示例 1:

输入: [1,2,3,4,5]
输出: true
示例 2:

输入: [5,4,3,2,1]
输出: false


这道题题目的意思是,数组列表内从左到右,有三个递增的数字即可,不要求连续。但是时间复杂度O(n)。
我也是看了下评论说使用first记录最小值,second记录倒数次大值。然后找一个比second大的数就可以了。

算法流程如下:

  • 首先是找到两个递增的数字(不要求连续),第一个赋值给first,第二个赋值给second。注意,在找两个递增的数的时候,可能遇到全是递减的数的情况,那么就会出界,所以判断越界的条件应该放在首位。如果找完了还是没有找到这样的数据,那么直接返回False.
  • 有了first 和second,我们就需要根据下一个待加入的值来更新first,或者second,或者直接输出True。定义c为待加入的数
  • 情况一:c < first 说明我们的第一个最小值需要更新,万一后面有以这个最小值c开头的三个递增数。所以first = c ,但是这里的second保持不变。因为我们这里要找三个递增数,缩小了左边界后,我们的右边界应该还是保持不变,这样才能和之后的数进行比较。
  • 情况二: first < c < second 这个时候我们的右边界需要缩小,后面大于second的数肯定大于c。左边界应该保持不变。
  • 情况三:c > second 说明刚好已经有三个数递增的了,可以直接输出。
  • 情况四:当 c == scond 或者 c == first的时候,我们什么也不做,相当于跳过这次。
    最后如果弹出循环之后,说明数组内没有这样的递增数列,返回false。
class Solution:
    def increasingTriplet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值