本题的重点是dp数组的定义
思路
动规五部曲
1.定义dp数组
dp[i][j]:表示nums1数组以下标为i-1结束,nums2数组以下标为j-1结束的最大子数组长度为dp[i][j]。
如果定以为i结束的话,实现起来很麻烦。
2.递推公式
if(nums1[i-1]==nums2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
3.初始化dp数组
根据定义的话dp[0][j]和dp[i][0]都是0,所以就用默认值,不用初始化。
4.遍历顺序
根据递推公式就可以知道是正序遍历。
5.打印dp数组
dp数组中最大的数就是最大子数组。
代码
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int l1=nums1.length;
int l2=nums2.length;
int dp[][] = new int[l1+1][l2+1];
for(int i = 1;i<=l1;i++){
for(int j =1;j<=l2;j++){
if(nums1[i-1]==nums2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
}
}
int res=0;
for(int i=0;i<=l1;i++){
for(int j= 0;j<=l2;j++){
res = Math.max(res,dp[i][j]);
}
}
return res;
}
}