力扣300、最长上升子序列动态规划刷题

在这里插入图片描述

解法1,复杂度O(n)

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        # 解法1,复杂度O(n)
        # 定义dp[]是以第i个元素结尾得最长字串长度,则答案就是dp中最大的那个数,转移方程为dp[i] =max(dp[i],dp[j]+1) if nums[j]<nums[i] j=0...i
        # 含义就是前面的看第i个可以加到前面的子序列后面不(大于前面的就可以加上去,然后序列长度+1),因为可能第i个数可以加在好几个后面,所以取最大
        dp=[]
        for i in range(len(nums)):
            dp.append(1)
            for j in range(i):
                if nums[j]<nums[i]:
                    dp[i] =max(dp[i],dp[j]+1)
        return max(dp)

解法2,复杂度O(nln(n))

from bisect import bisect_left

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        # 解法2,复杂度O(nln(n))
        '''
        相当于维护一个结果数组,如果当前元素比结果数组的值都大的的话,就追加在结果数组后面(相当于递增序列长度加了1)保证是个有序数组;否则的话用
        当前元素覆盖掉第一个比它大的元素(这样做的话后续递增序列才有可能更长,即使并没有更长,这个覆盖操作也并没有副作用哈,当然这个覆盖操作
        可能会让最终的结果数组值并不是最终的递增序列值,这无所谓)
        '''
        res= []
        length = 0
        for number in nums:
            index = bisect_left(res,number)    # https://blog.csdn.net/qq_43657442/article/details/109486471
            if index==length:
                res.append(number)
                length += 1
            else:
                res[index] = number
        return length
posted on 2021-06-11 09:10  雾恋过往  阅读(45)  评论(0)    收藏  举报

Live2D