300.最长递增子序列
题目链接 300. 最长递增子序列 - 力扣(LeetCode)
讲解链接 代码随想录 (programmercarl.com)
定义dp数组dp[i]为以num[i]为结尾的增长数组的最大长度;
此时dp[0]=1;
i遍历nums数组的长度,逐渐形成以每个元素结尾的递增数组长度表,并在每一个元素的遍历中,从头到尾更新以该元素结尾的最大长度:
for(int i=1;i<nums.size();i++){for(int j=0;j<i;j++){if(nums[i]>nums[j])dp[i]=max(dp[i],dp[j]+1);}if(dp[i]>result)result=dp[i];}
674. 最长连续递增序列
题目链接 674. 最长连续递增序列 - 力扣(LeetCode)
讲解链接 代码随想录 (programmercarl.com)
相较于上一题,本题增加了连续的条件,此时只需要判断前一个是否小于当前值,就可以给当前dp[i]赋值,最后形成表示以每个元素为结尾的最长递增连续数组长度表:
for(int i=1;i<nums.size();i++){if(nums[i-1]<nums[i]){dp[i]=dp[i-1]+1;}if(dp[i]>result)result=dp[i];}
718. 最长重复子数组
题目链接 718. 最长重复子数组 - 力扣(LeetCode)
讲解链接 代码随想录 (programmercarl.com)
对于两个数组中从不同位置开始的相同子数组,两层for循环分别遍历两个数组,并在每一次移动时判断是否相同;dp数组定义为:dp[i][j]等于下标结尾为i-1,j-1两个数组数字相等的最长长度,此时递归函数便可写为:
for(int i=1;i<=nums1.size();i++){for(int j=1;j<=nums2.size();j++){if(nums1[i-1]==nums2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}if(dp[i][j]>result)result=dp[i][j];}}
若是i-1,位置元素与j-1位置元素相等,则继承i-2,j-2位置元素最长长度dp[i-1][j-1].