0334. 递增的三元子序列
大约 2 分钟
0334. 递增的三元子序列
- 标签:贪心、数组
- 难度:中等
题目链接
题目大意
描述:给定一个整数数组 。
要求:判断数组中是否存在长度为 3 的递增子序列。
说明:
- 要求算法时间复杂度为 、空间复杂度为 。
- 长度为 的递增子序列:存在这样的三元组下标 (, , ) 且满足 ,使得 。
- 。
- 。
示例:
- 示例 1:
输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意
- 示例 2:
输入:nums = [5,4,3,2,1]
输出:false
解释:不存在满足题意的三元组
解题思路
思路 1:快慢指针
常规方法是三重 for
循环遍历三个数,但是时间复杂度为 ,肯定会超时的。
那么如何才能只进行一次遍历,就找到长度为 3 的递增子序列呢?
假设长度为 3 的递增子序列元素为 、、,。
先来考虑 和 。如果我们要使得一个数组 ,并且 。那么应该使得 尽可能的小,这样子我们下一个数字 才可以尽可能地满足条件。
同样对于 和 ,也应该使得 尽可能的小,下一个数字 才可以尽可能的满足条件。
所以,我们的目的是:在 的前提下,保证 a 尽可能小。在 的条件下,保证 尽可能小。
我们可以使用两个数 、 指向无穷大。遍历数组:
- 如果当前数字小于等于 ,则更新
a = num
; - 如果当前数字大于等于 ,则说明当前数满足 ,则判断:
- 如果 ,则更新
b = num
; - 如果 ,则说明找到了长度为 3 的递增子序列,直接输出 。
- 如果 ,则更新
- 如果遍历完仍未找到,则输出 。
思路 1:代码
class Solution:
def increasingTriplet(self, nums: List[int]) -> bool:
a = float('inf')
b = float('inf')
for num in nums:
if num <= a:
a = num
elif num <= b:
b = num
else:
return True
return False
思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。