在两条独立的水平线上按给定的顺序写下 nums1
和 nums2
中的整数。
现在,可以绘制一些连接两个数字 nums1[i]
和 nums2[j]
的直线,这些直线需要同时满足:
-
nums1[i] == nums2[j]
- 且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
示例 1:
输入:nums1 = [1,4,2], nums2 = [1,2,4] 输出:2 解释:可以画出两条不交叉的线,如上图所示。 但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。
示例 2:
输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2] 输出:3
示例 3:
输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1] 输出:2
做这题之前先去做1143.最长公共子序列,这题求的思路是一样的,代码也几乎一样,这题主要的是知道求最长公共子序列和如何把这题传化为求最长公共子序列的思路。求公共子序列的分享在我的上一篇:动态规划LeetCode-1143.最长公共子序列-CSDN博客
遇到最值问题,我们可以往动态规划方法去想一想,此题可以用动态规划来进行解题。动规五部曲(dp含义、递推公式、初始化、遍历顺序、打印数组) ,主要的就是把大问题拆解成小问题,小问题的值保存下来,从小问题的答案推导到最终答案,空间换时间。
题目及思路: 这个公共子序列指的是相对顺序不变。看完这题的题目和示例之后,示例一A和B的最长公共子序列是[1,4],长度为2。所以求不相交的连线求的就是最长公共子序列。
这里直接给出代码了,以下是我在力扣c语言提交的代码,仅供参考:
int maxUncrossedLines(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int dp[nums1Size+1][nums2Size+1];
memset(dp,0,sizeof(dp));
for(int i = 1;i<=nums1Size;i++)
{
for(int j =1;j<=nums2Size;j++)
{
if(nums1[i-1] == nums2[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = dp[i-1][j] > dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];
}
}
}
return dp[nums1Size][nums2Size];
}