1035. 不相交的线
在两条独立的水平线上按给定的顺序写下 nums1
和 nums2
中的整数。
现在,可以绘制一些连接两个数字 nums1[i]
和 nums2[j]
的直线,这些直线需要同时满足满足:
nums1[i] == nums2[j]
- 且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
示例 1:
1 | 输入:nums1 = [1,4,2], nums2 = [1,2,4] |
示例 2:
1 | 输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2] |
示例 3:
1 | 输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1] |
提示:
1 <= nums1.length, nums2.length <= 500
1 <= nums1[i], nums2[j] <= 2000
题解:
动态规划:
最长公共子序列变形题
定义dp[i][j]
表示nums1的前i个元素和nums2的前j个元素所能绘制的最大连接数。
从后往前看,首先判断nums1[i]和nums2[j]是否相等:
- 如果相等,则证明当前两元素能够连成一条线,则nums1和nums2的前i-1个元素所能绘制的最大连接数加1就是所有元素的最大连接数,即
dp[i][j] = dp[i-1][j-1] + 1
。 - 如果不相等,则证明当前两元素不能够连成一条线,则最大连接数为nums1去掉一个元素或者nums2去掉一个一个元素和另一个数组所能绘制的最大连接数,即
dp[i][j] = max(dp[i-1][j],dp[i][j-1])
。
代码如下:
1 | public int maxUncrossedLines(int[] nums1, int[] nums2) { |
- 时间复杂度:O(MN),需要遍历两个字符串。
- 空间复杂度:O(MN),需要使用到一个二维数组。