1287. 递增的三元子序列

1287. 递增的三元子序列

给定未排序的数组,返回是否在数组中存在递增的长度为3的子序列。

完整的功能应为:
如果存在i, j, k,使得arr[i] < arr[j] < arr[k],且0 ≤ i < j < k ≤ n-1,则返回true,否则返回false。
您的算法应该以O(n)时间复杂度和O(1)空间复杂度运行。

样例

样例1

输入: [1, 2, 3, 4, 5]
输出: true

样例2

输入: [5, 4, 3, 2, 1]
输出: false
class Solution:
    """
    @param nums: a list of integers
    @return: return a boolean
    """
    def increasingTriplet(self, nums):
        # write your code
        length = len(nums)
        
        #边界判断
        if len(nums) < 3: return False 
        
        #初始化
        first, second = nums[0], sys.maxsize
        #存储的要么是sys.maxsize, 要么是比first更小的值
        first_prepared = sys.maxsize
        
        for index in range(1, length):
            #首先, 如果存在右边的值大于左边的值得话, 则first, second都有值
            if second == sys.maxsize:
                if nums[index] < first:
                    first = nums[index]
                elif nums[index] > first:
                    second = nums[index]
            
            else:
                #判断是否存在第三个大于second
                if nums[index] > second:
                    return True 
                #如果在first和second之间的话
                elif first < nums[index] < second:
                    second = nums[index]
                #如果nums[index] < first的话
                elif nums[index] < first:
                    #如果比first_prepared更小的话,则更新first_prepared
                    if nums[index] < first_prepared:
                        first_prepared = nums[index]
                    #否则存在两个更小相对值的first和second的值,则first和second均替换
                    else:
                        second = first
                        first = first_prepared
                        first_prepared = sys.maxsize
            
        return False
                        
posted @ 2020-11-16 03:09  风不再来  阅读(150)  评论(0编辑  收藏  举报