思路分析:
-
创建一个二维数组
dp
用于存储公共子数组的长度,其中dp[i][j]
表示以nums1[i-1]
和nums2[j-1]
结尾的公共子数组的长度。(使用nums1[i-1]
和nums2[j-1]
的好处是可以保持动态规划递推关系的一致性,同时方便处理边界条件,使得动态规划数组的索引和实际元素位置相对应。这有助于代码的清晰性和易读性。) -
初始化迭代变量
i
和j
,以及存储最大长度的变量maxlong
。 -
使用嵌套循环遍历两个数组的每个元素。
-
在每次迭代中,检查当前两个数组的元素是否相等。如果相等,更新
dp[i][j]
为dp[i-1][j-1] + 1
,表示在当前位置上公共子数组的长度比前一个位置多1。 -
检查当前公共子数组的长度是否大于之前记录的最大长度
maxlong
,如果是,则更新maxlong
。 -
最终返回计算得到的最大长度
maxlong
作为结果。
class Solution {
public:
// 函数用于找到两个给定数组之间的最大公共子数组长度
int findLength(vector<int>& nums1, vector<int>& nums2) {
// 创建一个二维向量 'dp' 用于存储公共子数组的长度
// dp[i][j] 表示以 nums1[i-1] 和 nums2[j-1] 结尾的公共子数组的长度
vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
// 用于迭代的变量
int i, j;
// 存储最大长度的变量
int maxlong = 0;
// 嵌套循环遍历两个数组的每个元素
for (i = 1; i <= nums1.size(); i++) {
for (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] > maxlong)
// 如果是,更新最大长度
maxlong = dp[i][j];
}
}
// 返回计算得到的最大长度作为结果
return maxlong;
}
};