代码随想录——最长重复子数组(Leetcode 718)

题目链接
在这里插入图片描述

动态规划

思路:

  • 确定dp数组以及下标的含义
    dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]

  • 确定递推公式
    根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。
    dp[i][j] = dp[i - 1][j - 1] + 1;
    根据递推公式可以看出,遍历i 和 j 要从1开始!

  • dp数组如何初始化
    根据dp[i][j]的定义,dp[i][0] 和dp[0][j]其实都是没有意义的!
    但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;所以dp[i][0] 和dp[0][j]初始化为0。

  • 确定遍历顺序
    外层for循环遍历A,内层for循环遍历B。

class Solution {
    
    
    public int findLength(int[] nums1, int[] nums2) {
    
    
        int res = 0;
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        for(int i = 1; i < nums1.length + 1; i++){
    
    
            for(int j = 1; j < nums2.length + 1; j++){
    
    
                if(nums1[i - 1] == nums2[j - 1]){
    
    
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    res = Math.max(res, dp[i][j]);
                }
            }
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_46574748/article/details/140990899