Leetcode 300.最长递增子序列(719)

题目

26年7月19日(首刷看解)

Go 复制代码
func lengthOfLIS(nums []int) int {
    //dp[n]表示在n个数字时,最长严格递增子序列的长度
    dp:=make([]int,len(nums)+1)
    for i,_ := range dp{
        dp[i]=1
    }
    dp[0]=0
    res:=dp[1]
    for i:=2;i<=len(nums);i++{
        for j:=1;j<i;j++{
            if nums[i-1]>nums[j-1]{
                dp[i]=max(dp[i],dp[j]+1)
            }
        }
        if dp[i]>res{
            res=dp[i]
        }
    }
     return res
}

思路

先给我最开始错误的代码

Go 复制代码
func lengthOfLIS(nums []int) int {
    //dp[n]表示以n数字结尾的最长严格递增子序列的长度
    dp:=make([]int,len(nums)+1)
    dp[0]=0
    dp[1]=1
    res:=1
    for i:=2;i<=len(nums);i++{
        if nums[i-1]>nums[i-2]{
            dp[i]=dp[i-1]+1
            res=max(res,dp[i])
        }else{
            dp[i]=1
        }
    }
    return res
}

这个代码问题就在于其实它实际求的是连续的递增子序列。我思考怎么把之前的数(间断的)也要考虑进去,思考无果后看解后理解独立自解

首先递推公式我的理解就是

如果dpi会+1,肯定是在这个对应的数字大过前面的数字下才会更新,那么其实dpi,就是在大过的那个数字的dp考虑下再+1,有点抽象,于是现在的数字大于前面的数字,对应的结果就是+1,而前面的数字对应前前面的数字对应的就是dpj,组合起来就是到i为止的最大子序列,但是这个j是每一个小于i的数字都需要考虑的。所以是在满足大于的情况下遍历取dp【j】+1的最大值

但是还有一个问题,就是由于数组本身是无序的 ,你不能保证以最后的那个数字结尾dplen(nums)就是最大值,注意数组含义,dpn表示以n数字结尾的最长严格递增子序列的长度,所以最大值是在遍历的过程中保存到res的,最后返回res,这就是我的理解。

相关推荐
鹿角片ljp4 分钟前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
residual_fan1 小时前
航空发动机故障诊断专用智能体(三):基于对比学习的时序特征区分方法
人工智能·算法·数据挖掘·数据分析
高亦真1 小时前
今天是学习嵌入式的第39天
linux·学习·算法
Omics Pro2 小时前
AI药物研发10原则!欧盟EMA×美国FDA
数据库·人工智能·算法·机器学习·自然语言处理
wabs6662 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
知知之之2 小时前
敏感数据查询:SHA-256 还是 HMAC-SHA256
算法
彧azz2 小时前
Java学习记录:判断语句
java·笔记·学习·算法
alphaTao2 小时前
LeetCode 每日一题 2026/9/14-2026/9/20
算法·leetcode
hanlin032 小时前
刷题笔记:力扣第560题-和为k的子数组
笔记·算法·leetcode
residual_fan3 小时前
航空发动机故障诊断专用智能体(四):深度强化学习与自适应奖励机制
人工智能·算法·数据挖掘·数据分析