代码随想录笔记_动态规划_718最长重复子数组

代码随想录二刷笔记记录

LC718.最长重复子数组


题目

子序列问题

给两个整数数组 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


思路分析

思路

子数组问题,可以理解为子序列问题 -> 动态规划

A = [1,2,3,2,1], B = [3,2,1,4,7]
具体思路:
把A的元素逐个和B中的元素遍历,如果遇到 A[i] = B[j] ,则继续比较 A[i+1] 和 B[j+1] ,将 dp + 1 ,否则,dp长度保持不变。

例如: A[0] = B[2] ,则拿A[1] 和 B[3] 继续比较,A[1] != B[3] 则停止,继续遍历A[2]和B[0] - B[4]

动态规划五部曲

1.确定dp数组及其下标的含义

dp[i][j] : 以下标 i-1 结尾的数组A,和以下标 j-1 结尾的数组B,最长重复子数组的长度
注意,dp[0][0] 无意义,仅是为了增维,使得计算方便。详见5.推演分析

2.确定递推公式

//根据dp[i][j] 的定义,可知,
//dp[i][j] 由 dp[i-1][j-1] 推导而来
//当 A[i-1] 和 B[j-1] 相等时,更新dp[i][j]
if(A[i-1] == B[j-1]){
	dp[i][j] = dp[i-1][j-1] + 1;
}

3.初始化

假设:A[0] = B[0], 则 dp[1][1] 需由 dp[0][0] + 1,因此 dp[0][0] 需要初始化为0。
推广可知,dp[i][0] 和 dp[0][j] 同理,都要初始化为0。

4.遍历顺序

根据递推公式可知,从前往后遍历。
具体:先遍历A,拿着A的元素,再遍历B。

for (int i = 1; i <= lenA; i++) {
     for (int j = 1; j <= lenB; j++) {
         if (nums1[i-1] == nums2[j-1]){
         	dp[i][j] = dp[i-1][j-1] + 1;
         }
         max = Math.max(dp[i][j],max);
        }
 }

5.推演分析

以 A = [1,2,3,2,1], B = [3,2,1,4,7] 为例

请添加图片描述

B(j) 3 2 1 4 7
A(i) 0 0 0 0 0 0
1 0 0 0 1 0 0
2 0 0 1 0 0 0
3 0 1 0 0 0 0
2 0 0 2 0 0 0
1 0 0 0 3 0 0

代码实现

完整代码实现

public int findLength(int[] nums1, int[] nums2) {
        int lenA = nums1.length;
        int lenB = nums2.length;
        if (lenA == 0 || lenB == 0) return 0;
        //初始化
        int[][] dp = new int[lenA+1][lenB+1];
        //遍历
        int max = 0;
        for (int i = 1; i <= lenA; i++) {
            for (int j = 1; j <= lenB; j++) {
                if (nums1[i-1] == nums2[j-1]){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                max = Math.max(dp[i][j],max);
            }
        }
        return max;
    }

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...