十三. 动态规划(mid)

子序列最值问题一般都用动态规划

300. 最长递增子序列

一般解:

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums: return 0
        # dp[i] 为考虑前 i 个元素,以第 i 个数字结尾的最长上升子序列的长度
        n = len(nums)
        dp = [1] * n
        for i in range(n):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j]+1)
        return max(dp)

# 时间复杂度:O(n^2)
# 空间复杂度:O(n)

最优解:

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        d = [nums[0]]
        for i in range(1, len(nums)):
            if nums[i] > d[-1]:
                d.append(nums[i])
            else:
                l = 0; r = len(d) - 1
                index = r
          

你可能感兴趣的:(算法,动态规划,算法,leetcode)