题目链接:力扣-1035不相交的线
前情提要:
因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。
dp五部曲。
1.确定dp数组和i下标的含义。
2.确定递推公式。
3.dp初始化。
4.确定dp的遍历顺序。
5.如果没有ac打印dp数组 利于debug。
每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。
题目思路:
其实本题刚入手会很懵,什么是不相交的线。
抽象来说就是本数组中与另一个数组相对应的一对数都在上一对相应的数的后面。
也就是只要他们的相对顺序不变。本对在上一对的后面,那么他们就不会相交。
举个例子。
其实也就是说A(上面一个数组)和B(下面的数组)的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面)
最大不相交的线的连线数就是俩个数组的最长公共子序列。
如果你做过1143. 最长公共子序列 - 力扣(LeetCode)并且看过我的这篇题解最长公共子序列,那么你会发现该题与力扣1143的代码完全类似,唯一不同的就是1143是字符串,本题是数组。
具体分析可以参照我的这篇题解最长公共子序列。
这里我就直接给出最终代码了。
最终代码:
class Solution {
public int maxUncrossedLines(int[] nums1, int[] nums2) {
//dp数组的定义
int dp [][] = new int [nums1.length + 1][nums2.length + 1];
//dp遍历顺序
for(int i = 1;i <= nums1.length;i ++){
for(int 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][j - 1],dp[i - 1][j]);
}
}
}
return dp[nums1.length][nums2.length];
}
}
这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。
我很乐意为你解答。那么我们下篇再见!