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)
View Code

猜你喜欢

转载自www.cnblogs.com/xxswkl/p/12307101.html