1.题目描述:
给两个整数数组nums1和nums2,返回两个数组中公共的、长度最长的子数组的长度。
2.动态规划:
二维dp[][]数组dp[i][j]代表以nums1[i - 1]和nums[j - 1]结尾的最长重复子数组。注意子数组是连续的。
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int max = 0;
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
//dp[i][j]代表以nums1[i - 1]和nums[j - 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;//nums1[0]与nums2[0]相等时符合推导,不进if则为初值0
max = Math.max(max, dp[i][j]);
}
}
return max;
}
}
状态压缩:
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int max = 0;
int[] dp = new int[nums2.length + 1];
//dp[i][j]代表以nums1[i - 1]和nums[j - 1]结尾的最长重复子数组
for (int i = 1; i < nums1.length + 1; i++) {
for (int j = nums2.length; j > 0; j--) {
if (nums1[i - 1] == nums2[j - 1]) dp[j] = dp[j - 1] + 1;
else dp[j] = 0;//由于是一维dp,需要手动重置初值为0
max = Math.max(max, dp[j]);
}
}
return max;
}
}