文章目录
题目描述
思路分析
注意题目中所说的是递增子序列,并不需要连续。
我们要找到是否存在递增的三个数。
最优方案要使第一个数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