最长上升子序列,经典

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        方法一,动态规划
        if not nums:
            return 0
        dp = [1]*len(nums)#dp【0】以0位结尾的,最长上升子序列长度为1
        for i in range(1,len(nums)):
            for j in range(i):
                if nums[i]>nums[j]:
                    dp[i] = max(dp[i],dp[j]+1)
        return max(dp)
        方法二,动态规划+二分
        top = []
        for i in range(len(nums)):
            left,right=0,len(top)-1
            while left<=right:
                mid = left+(right-left)//2
                if top[mid]<nums[i]:
                    left = mid + 1
                else:
                    right = mid - 1
            #left表示在【0,len(top))的索引中,第一个大于nums[i]的索引
            if left==len(top):
                top.append(nums[i])
            else:
                top[left]=nums[i]
        return len(top)
参考链接:
https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-dong-tai-gui-hua-2/
https://blog.csdn.net/qq_36512295/article/details/100835261
时间复杂度n2->nlogn,空间复杂度都是n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值