LeetCode 300. 最长递增子序列

题目

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

例:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

方法:动态规划
  • 若整数数组 nums 的长度为 1,那么最长递增子序列即为该数字,长度为 1
  • 同理,由于 dp[i] 表示 i 及 i 以前的组成的数组所拥有的最长递增子序列的长度,那么应将其初始化为 1 而非之前的 0
  • result 表示此时(最终)的最长递增子序列的长度
  • 外层循环即为对除第一个数字外的其他数字 i 从前到后的循环,而内层循环为对从第一个数字到 i-1 数字的循环。
    • 若数字 nums[i] 大于此时的 nums[j],及表示此时的数字 nums[i] 可以同 nums[j] 和与 nums[j] 组成最长递增序列的数字序列结合组成新的递增序列。通过对每个递增序列的长度进行对比,选择最长递增子序列,即得到 dp[i]
    • 每结束一次内层循环,计算一次此时的最长递增子序列的长度 result
class Solution(object):
    def lengthOfLIS(self, nums):
        if len(nums) == 1:
            return 1
        dp = [1] * len(nums)
        result = 0
        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)
            result = max(result, dp[i])
        return result
参考

代码相关:https://programmercarl.com/0300.%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容