文章目录

题目描述

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

思路分析

注意题目中所说的是递增子序列,并不需要连续。

我们要找到是否存在递增的三个数。
最优方案要使第一个数first尽可能的小。
第二个数second比first大且尽可能地小。
此时只需要再找到一个数大于second即找到答案。

冒出一个思路,很可能是贪心,可以维护两个指针,第一个指针指向first,第二个指针指向second,使得在条件first<second下 两个数尽可能的小。如是有下面的思路:

  • 设数组的第一个数为 first
  • 设第二个数second为无穷大
  • 此时遍历数组,如果找到一个数大于second,说明找到了第三个数,则直接返回True。
  • 继续往后,如果找到一个数大于first但小于second,则更新second。
  • 继续往后,说明这个数既不大于second,也不大于first。则更新first。

完整代码

class Solution:
def increasingTriplet(self, nums: List[int]) -> bool:
if len(nums) < 3 or len(set(nums)) < 3:
return False
first = nums[0];
second = float('inf') # 初设为无穷大
for i in range(len(nums)):
if nums[i] > second: # 说明已经找到一个数大于第二个数,即找到third这个数
return True
if nums[i] > first: # 说明找到一个数 小于sencond 大于first 则说明找到了一个比second更小的数,更新second
second = nums[i]
else: # 说明找到一个数字 比fisrt更小 则更新first
first = nums[i]
return False