334递增的三元子序列
题目:给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。
数学表达式如下:
如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。
链接:https://leetcode-cn.com/problems/increasing-triplet-subsequence
法一:官方解法
思路:非常巧妙,由于题目只要求返回是否存在递增的三元子序列,于是维护一个数组a,a中的最后一个值是最大值,如果新来的数大于最大值了,则加到后面,a中的第一个数是最小值,如果新来的数在第一个数和第二个数之间,则更新第二个数,如果a的长度达到3了,则返回结果。
# 执行用时 :56 ms, 在所有 Python3 提交中击败了95.60% 的用户 # 内存消耗 :13.9 MB, 在所有 Python3 提交中击败了51.50%的用户 # 总体思想是让要更新的子序列中的数尽可能小 from typing import List class Solution: def increasingTriplet(self, nums: List[int]) -> bool: if len(nums) == 0: return False a = [nums[0]] for i in nums[1:]: # a中最后一个值是最大值,如果大于最大值直接加在a后面 if i > a[-1]: a = a + [i] # 如果大于最小值了,则需要更新a, # 此时a的长度只可能是1或2,无论长度是1还是2,都是更新最后一个值 elif i > a[0]: a[-1] = i # 否则说明小于等于第一个值,将第一个值替换 else: a[0] = i if len(a) == 3: return True return False if __name__ == '__main__': duixiang = Solution() a = duixiang.increasingTriplet([]) print(a)