/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number} */ const findLength = function (nums1, nums2) { }; /* 定义:dp[i][j]表示nums1从i开始,nums2从j开始的最长子数组的长度,dp[i][j]可以由两种情况得来,第一种,当nums1[i] !== nums2[j], 那么从这个位置开始的子数组,就不可能是公共子数组,多以dp[i][j] = 0;第二种,当nums1[i] === nums2[j] 那么dp[i][j] = 1 + dp[i+1][j+1] 得来。 */ function f1(nums1, nums2) { const m = nums1.length; const n = nums2.length; let result = 0; // 定义dp表,并且初始化 const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); // 按照dp[i][j]的定义我们需要从下到上,从右到左填充dp数组 for (let i = m - 1; i >= 0; i--) { for (let j = n - 1; j >= 0; j--) { if (nums1[i] === nums2[j]) { dp[i][j] = 1 + dp[i + 1][j + 1]; result = Math.max(result, dp[i][j]); } else { dp[i][j] = 0; } } } console.log(dp); return result; } f1([0, 0, 0, 0, 1], [0, 0, 0, 0, 1]);