题目描述
错误代码
public static int maxUncrossedLines ( int [ ] nums1, int [ ] nums2) {
int i= 0 ;
int j= 0 ;
int local= 0 ;
int ans1= 0 ;
int ans2= 0 ;
while ( i != nums1. length && local != nums2. length) {
if ( nums1[ i] == nums2[ j] ) {
ans1++ ;
i++ ;
j++ ;
local= j;
}
else {
if ( j!= nums2. length- 1 ) j++ ;
else {
j= local;
i++ ;
}
}
}
i= 0 ;
j= 0 ;
local= 0 ;
while ( i != nums2. length && local != nums1. length) {
if ( nums2[ i] == nums1[ j] ) {
ans2++ ;
i++ ;
j++ ;
local= j;
}
else {
if ( j!= nums1. length- 1 ) j++ ;
else {
j= local;
i++ ;
}
}
}
System. out. println ( ans1) ;
return Math. max ( ans1, ans2) ;
}
思路
本质还是动态规划 相当于求两个数组的最大顺序子集长度 写出状态转移公式 用i代表nums1[0,i] 用j代表nums2[0,j]的元素,dp[i][j]表示nums[0,i]和nums[0,j]的最大连接数,可以写出状态转移公式
如果nums1[i-1]==nums2[i-1] dp[i][j] = dp[i-1][j-1]+1 如果nums1[i-1]!=nums2[i-1] dp[i][j] = Max(dp[i-1][j],dp[i][j-1]);
代码
public static int maxUncrossedLines ( int [ ] nums1, int [ ] nums2) {
int i= 0 , j= 0 ;
int [ ] [ ] dp = new int [ nums1. length+ 1 ] [ nums2. length+ 1 ] ;
for ( i= 1 ; i<= nums1. length; i++ ) {
for ( j= 1 ; j<= nums2. length; j++ ) {
if ( nums1[ i- 1 ] == nums2[ j- 1 ] ) dp[ i] [ j] = dp[ i- 1 ] [ j- 1 ] + 1 ;
else dp[ i] [ j] = Math. max ( dp[ i- 1 ] [ j] , dp[ i] [ j- 1 ] ) ;
}
}
return dp[ nums1. length] [ nums2. length] ;
}