LeetCode 300最长上升子序列 Python题解

最长上升子序列链接

# 最长上升子序列
"""
给你一个整数数组 nums,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
例如 [3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
"""


class Solution:
    def lengthOfLIS(self, nums) -> int:
        dp = [0 for i in range(len(nums))]  # 肯定需要一个当前位置连续递增的数量列表
        # [1, 1, 1, 2, 2, 3, 4, 4] print(dp)
        for i in range(len(nums)):  # 循环所有
            dp[i] = 1  # 对应状态设为1(因为自己本身也算一个递增)
            for j in range(i):  # 那么就是循环i前面的区间
                if nums[j] < nums[i]:  # 如果有nums[i]小的 说明在对应的dp[j]的位置值加1 保存
                    dp[i] = max(dp[i], dp[j] + 1)
                    # 注意拿dp[i]和dp[j]+1比较是为了防止 最大的如果已经保存到dp[i]的话 那么小的就不需要了

        return max(dp)


"""
    小tips
        a[:]  # 如果取不出来值就为空 
        a[n]  # 如果n超界就会报错
        for i in range(0): 是不会循环的 也不会报错 
"""
nums = [10, 9, 2, 5, 3, 7, 101, 18]
a = Solution()
print(a.lengthOfLIS(nums))

最长上升子序列(LIS),动态规划模板题,不是很难

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值