标签:int 重复子 最长 nums2 数组 nums1 dp
题目链接
题目描述
注意点
- 子数组是连续的
解答思路
- 采用动态规划查找最长重复子数组的长度
代码
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int m1 = nums1.length;
int m2 = nums2.length;
int max = 0;
int[][] dp = new int[m1 + 1][m2 + 1];
for(int i = m1 - 1;i >= 0;i--){
for(int j = m2 - 1;j >= 0;j--){
if(nums1[i] == nums2[j]){
dp[i][j] = dp[i + 1][j + 1] + 1;
max = dp[i][j] > max ? dp[i][j] : max;
}else{
dp[i][j] = 0;
}
}
}
return max;
}
}
关键点
- 理解动态规划的思想
从上一层的关系推出下一层的关系,在本题中,算nums1中索引i和nums2中索引j的最长重复子数组的方法是:如果nums1[[i]根本不等于nums2[j],那么其最长重复子数组肯定为0
如果nums1[[i]等于nums2[j],则需要根据nums1[i + 1]和nums1[j + 1]的最长重复子数组的基础上再加1就是nums1[i]和nums1[j]的最长重复子数组,所以需要从后往前遍历,并且用一个数组dp储存每一层的最长重复子数组的值,不断向前遍历到nums1[0]和nums2[0],再从数组dp中找到最大值
标签:int,重复子,最长,nums2,数组,nums1,dp 来源: https://blog.csdn.net/weixin_51628158/article/details/119077659
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。