• 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
  • 相关阅读:
    Java
    Linux
    Linux
    Linux
    Java
    Ansible
    Ansible
    Java
    ACM&OI 基础数论算法专题
    题解 P4781 【【模板】拉格朗日插值】
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12307101.html
Copyright © 2020-2023  润新知