LeetCode 718. 最长重复子数组 java题解

https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/

动态规划

java 复制代码
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int len1=nums1.length,len2=nums2.length;
        int[][] dp=new int[len1+1][len2+1];
        dp[0][0]=0;//没有意义,方便后面转移
        int max=0;
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;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;
    }
}
/*
dp[i][j],代表nums1[i-1],nums2[j-1]为结尾的序列,他们的最大公共序列长度。
dp[i][j]从dp[i-1][j-1]转化而来
如果nums1[i]=nums2[j],说明本数字相等,那么前面的结果可以+1
*/

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

我就定义dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,最长重复子数组长度。不行么?当然可以,就是实现起来麻烦一些。

如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。

相关推荐
知兀1 分钟前
【Result类】(使用/不使用<T> data的情况);自带静态方法、纯数据类;
java·开发语言
Seven972 分钟前
【从0到1构建一个ClaudeAgent】协作-自主Agent
java
洋不写bug8 分钟前
Java线程(三):线程执行顺序问题、可重入锁、加锁操作解析,死锁解决
java·开发语言
诸葛务农10 分钟前
光电对抗:多模复合制导烟雾干扰外场试验及仿真(4)
人工智能·算法·光电对抗
WolfGang00732119 分钟前
代码随想录算法训练营 Day39 | 动态规划 part12
算法·动态规划
lifallen22 分钟前
Flink Source / Sink Exactly-Once 边界分析
java·大数据·flink
xyyaihxl28 分钟前
将 vue3 项目打包后部署在 springboot 项目运行
java·spring boot·后端
阿Y加油吧32 分钟前
动态规划经典题解:最长递增子序列 & 乘积最大子数组
算法·动态规划·代理模式
f3iiish39 分钟前
3783. 整数的镜像距离 力扣
算法·leetcode
Not Dr.Wang42242 分钟前
基于matlab的控制系统奈氏图及其稳定性分析
数据结构·算法·matlab