【LeetCode】300.最长递增子序列

首先分析这个问题,以示例1为例。

已经求得最大递增子序列长度为4,而且该子序列中最后一个数为101,

那么一定存在一个数ai,使得ai以及ai之前的所有数组成的序列中,

最大递增子序列长度为3,而且该子序列中最后一个数为ai。

我们记dp i 为,从第0个数到第 i-1 个数所组成的序列中,最大递增子序列的长度。那么在示例1中,dp 0 =1;dp 1 =1;dp 2 =1;dp 3 =2;dp 4 =2;dp 5 =3;dp 6 =4;dp 7 =4.

示例2中,dp 0 =1;dp 1 =2;dp 2 =2;dp 3 =3;dp 4 =3;dp 5 =4.

可以看出dp i 的值是依次以某种规律递增的。

但由于要求是严格递增的子序列,因此ai之前比ai大的数就不再纳入考虑。

综上所述,dp i 的值可以这么确定:找到ai之前比它小的数ak,dp i =dp k +1,最后为了使dpi最大,就必须使dp k 最大,因此要在ai之前的数里找到最大的dp k ,由此就得到了dp i

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int dp[2510]={0};
        int len=nums.size();
        for(int i=0;i<len;++i)
        {
            dp[i]=1;
//子序列长度最小值是 1
            for(int j=0;j<i;++j)
//第二层循环的目的是找到nums[i]之前比它小的数nums[j],
//找到最大值dp[j]之后,dp[i]=dp[j]+1
//下面这种写法等效于上面的分析,不过省了一点代码
            {
                if(nums[j]<nums[i])
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
        int MAX=0;
        for(int i=0;i<len;++i) MAX=max(MAX,dp[i]);
//这里需要遍历整个dp数组找出最大值,原因在下面
        return MAX;
    }
};

需要注意的是:这种方法最后需要遍历一遍dp数组来找出最大值,因为如果给出的序列如下:

元素:1,3,6,7,9,4,10,5,6

编号:0 1 2 3 4 5 6 7 8

那么dp 6 =6,但是计算dp 5 时,由于6、7、9都比4大,因此只考虑了dp 5 =max(dp 5 ,dp 1 +1),而dp 1 =2,故dp 5 =3;这就导致计算dp 7 =max(dp 7 ,dp 5 +1)=4,同理dp8=5,如果直接输出dp len ,就错了。

相关推荐
数据科学小丫2 分钟前
算法:随机森林算法
算法·随机森林·机器学习
Samson Bruce9 分钟前
【初高中数学】
线性代数·数学·算法·机器学习
redaijufeng10 分钟前
我在C++中深入理解了继承,收获颇丰
java·c++·算法
承渊政道10 分钟前
【MySQL数据库学习】MySQL基本查询(下)
数据库·学习·mysql·leetcode·bash·数据库开发·数据库系统
Ricky055311 分钟前
DEIM :采用改进匹配算法实现快速收敛的DETR(中国25年3月研究)
人工智能·算法·目标跟踪
无限码力12 分钟前
美团研发岗 5月9号笔试真题 - 弹性分桶
算法·美团笔试题·美团研发岗笔试题·美团0509笔试题
J2虾虾13 分钟前
C 语言 sizeof 完全用法指南
c语言·数据结构·算法
阿正的梦工坊18 分钟前
【Rust】03-所有权、移动与复制
开发语言·算法·rust
好评笔记30 分钟前
深度学习面试八股—— GRU(Gated Recurrent Unit)
人工智能·rnn·深度学习·算法·机器学习·gru·校招
搞科研的小刘选手36 分钟前
【智能计算方向专题研讨会】第三届智能计算与数据分析国际学术会议(ICDA 2026)
大数据·算法·机器学习·数据挖掘·数据分析·可视化·计算