文章链接: 300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组
视频链接: 300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组
题目链接: 300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组
300.最长递增子序列
思路:
1.dp数组的含义:dp[i]表示i之前包括i的 以nums[i]结尾 的最长递增子序列的长度;
2.递推公式:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
3.初始化dp数组:最长递增子序列最小也为dp[i] = 1;
674.最长连续递增序列
思路:
与上一题的区别:该题要求是 连续 的递增子序列;只需比较nums[i]和nums[i - 1];
1.dp数组的含义:dp[i]表示i之前包括i的 以nums[i]结尾 的最长连续递增子序列的长度;
2.递推公式:if (nums[i] > nums[i - 1]) dp[i] = max(dp[i], dp[i - 1] + 1);
3.初始化dp数组:最长递增子序列最小也为dp[i] = 1;
718.最长重复子数组
思路:
1.dp数组的含义:
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。
问:为什么不能“以下标i为结尾的A,和以下标j为结尾的B,最长重复子数组长度为dp[i][j]。”?
答:因为如果按照问题中的这种定义方法,那么初始化数组时很麻烦,要单独处理初始化的部分;而用第一种定义的方法,就可以直接将dp[i][0] 和 dp[0][j]初始化成0;
2.递推公式:if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
3.初始化dp数组:dp[i][0] 和dp[0][j]要初始化为0。