力扣题目
解题思路
java代码
力扣题目:
给两个整数数组 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
解题思路:
代码思路:
- 首先,创建一个二维数组
dp
,其大小为(m + 1) * (n + 1)
,其中m
是nums1
的长度,n
是nums2
的长度。 - 通过两层循环遍历两个数组。
- 当
nums1[i - 1]
和nums2[j - 1]
相等时,dp[i][j]
的值等于dp[i - 1][j - 1] + 1
,表示以当前位置为结尾的相同元素子数组长度比前一个位置增加 1 。 - 同时,使用
res
变量来保存当前找到的最大长度,并在每次更新dp[i][j]
时更新res
。
示例说明:
假设 nums1 = [1, 2, 2, 2, 3]
, nums2 = [2, 2, 3, 4, 2]
。
- 当
i = 1
,j = 1
时,nums1[0]!= nums2[0]
,dp[1][1] = 0
。 - 当
i = 2
,j = 2
时,nums1[1] == nums2[1]
,dp[2][2] = dp[1][1] + 1 = 1
。 - 以此类推,不断更新
dp
数组,并记录最大长度。
java代码:
package org.example.mouth8;
public class Leetcode718 {
public static void main(String[] args) {
int[] nums1 = new int[]{1, 3, 2, 2, 5, 2, 3, 7};
int[] nums2 = new int[]{2, 2, 6, 5, 4, 5, 6, 6, 7, 3, 7};
System.out.println(findLength(nums1, nums2));
}
public static int findLength(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int[][] dp = new int[m + 1][n + 1];
int res = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; 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;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项