【LeetCode】Day37-贪心算法值得学习

注:day35,day36还未完全理解。暂不写在CSDN。

334.递增的三元子序列

给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。

输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意

解法①:双向遍历,详细题解见leetcode官方 

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        n = len(nums)
        if n < 3:
            return False
        leftMin = [0] * n
        leftMin[0] = nums[0]    #leftmin找的是当期i位置的元素,左边最小的元素,第一个元素左边没有数,所以赋值为本身
        for i in range(1,n):
            leftMin[i] = min(leftMin[i-1],nums[i])
        rightMax = [0] * n 
        rightMax[n-1] = nums[n-1]
        for j in range(n-2,-1,-1):
            rightMax[j] = max(rightMax[j+1],nums[j])
        #这里的i是三个元素中间元素的索引
        for z in range(1,n-1):
            #当前i位置左边最小的和左边最大的,不能是nums[i]本身,不能相等,所以找的是leftMin[z-1]和rightMax[z+1]
            if leftMin[z-1]

复杂度:

时间复杂度:O(n),其中 n 是数组 nums 的长度。需要遍历数组三次。

空间复杂度:O(n),其中 n 是数组 nums 的长度。需要创建两个长度为 n 的数组 leftMin 和 rightMax。

解法②:贪心策略,详细见leetcode官方

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        n = len(nums)
        if n < 3:
            return False
        #float('inf')python3中最大的浮点数
        first, second = nums[0], float('inf')
        for i in range(1, n):
            num = nums[i]
            if num > second:
                return True
            if num > first:
                second = num
            else:
                first = num
        return False

复杂度:

  • 时间复杂度:O(n),其中 nn 是数组 \textit{nums}nums 的长度。需要遍历数组一次。

  • 空间复杂度:O(1)。

你可能感兴趣的:(LeetCode刷题笔记,leetcode,蓝桥杯,算法)