leetcode---718. 最长重复子数组(JavaScript解法)---动态规划

    技术2022-07-10  118

    一、题目描述

    给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

    二、示例

    三、思路讲解

    由题目分析,我们可以先看最后两个数组的最后一个数,如果相同的话,再看前一个 如果符合的话 加上自身相同的1,所以最后的结果和之前的子结果是相关的。就可以写出dp方程,dp[i][j] = dp[i-1][j-1]+1,开始时先对数组进行一个初始化。为了优化我们可以将二维数组换成一维数组,方程就变为

    四 、代码

    /** * @param {number[]} A * @param {number[]} B * @return {number} */ const findLength = (A, B) => { const m = A.length; const n = B.length; const dp = new Array(m + 1); for (let i = 0; i <= m; i++) { dp[i] = new Array(n + 1).fill(0); } // 初始化二维数组dp,每一项都是0 let res = 0; for (let i = 1; i <= m; i++) { for (let j = 1; j <= n; j++) { if (A[i - 1] == B[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } res = Math.max(dp[i][j], res); } } return res; } //优化后的代码 //二维变一维 //Math.max()换成if来赋值 const findLength = (A, B) => { const n = A.length; const m = B.length; var max = 0; const dp = new Array(m + 1).fill(0); for (let i = 0; i < n; i++) { for (let j = m; j > 0; j--) { dp[j] = A[i] == B[j - 1] ? dp[j - 1] + 1 : 0; if (dp[j] > max) max = dp[j]; } } return max; }

    五、结果

    Processed: 0.018, SQL: 9