给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 1:
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
示例 2:
输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5
提示:
- 1 <= nums1.length, nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 100
解题思路
1.假设一个二维数组,其元素值为重复子数组【这里是元素连续的,与子序列不同】的个数。如果nums1[i] === nums2[j],则dp[i][j]个数为dp[i - 1][j - 1] + 1。如果nums1[i] !== nums2[j],则保存最大长度即可。
2.注意:为了方便计算,需要设置边界条件,在首列和首行补0
代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
const findLength = (nums1, nums2) => {
const [m, n] = [nums1.length, nums2.length];
const dp = [];
// dp数组初始化
// 先让所有元素为0
for (let i = 0; i <= m; i++) {
dp[i] = [];
for (let j = 0; j <= n; j++) {
dp[i].push(0);
}
}
let res = 0;
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (nums1[i - 1] === nums2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
res = dp[i][j] > res ? dp[i][j] : res;
}
}
return res;
};