You are given two integer arrays nums1
and nums2
. We write the integers of nums1
and nums2
(in the order they are given) on two separate horizontal lines.
We may draw connecting lines: a straight line connecting two numbers nums1[i]
and nums2[j]
such that:
nums1[i] == nums2[j]
, and- the line we draw does not intersect any other connecting (non-horizontal) line.
Note that a connecting line cannot intersect even at the endpoints (i.e., each number can only belong to one connecting line).
Return the maximum number of connecting lines we can draw in this way.
Example 1:
Input: nums1 = [1,4,2], nums2 = [1,2,4] Output: 2 Explanation: We can draw 2 uncrossed lines as in the diagram. We cannot draw 3 uncrossed lines, because the line from nums1[1] = 4 to nums2[2] = 4 will intersect the line from nums1[2]=2 to nums2[1]=2.
Example 2:
Input: nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2] Output: 3
Example 3:
Input: nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1] Output: 2
Constraints:
1 <= nums1.length, nums2.length <= 500
1 <= nums1[i], nums2[j] <= 2000
题目链接:https://leetcode.com/problems/uncrossed-lines/
题目大意:给两排数字,相同的可以连线,求最多可以连多少不相交的线
题目分析:开始先往单调栈的方向思考了,类似LIS,但发现是有问题的,在第一排后面数字和第二排前面相同时没法决策,因此考虑dp,dp[i][j]表示第一排到i,第二排到j时不相交线的最大值,转移方程很显然,不懂为啥给的数据范围这么小。。。
4ms,时间击败96.05%
class Solution {
public int maxUncrossedLines(int[] nums1, int[] nums2) {
int n = nums1.length, m = nums2.length;
int[][] dp = new int[n][m];
dp[0][0] = nums1[0] == nums2[0] ? 1 : 0;
for (int j = 1; j < m; j++) {
dp[0][j] = (nums1[0] == nums2[j]) ? 1 : dp[0][j - 1];
}
for (int i = 1; i < n; i++) {
dp[i][0] = (nums1[i] == nums2[0]) ? 1 : dp[i - 1][0];
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (nums1[i] == nums2[j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
// System.out.println("dp["+i+"]["+j+"] = " + dp[i][j]);
}
}
return dp[n - 1][m - 1];
}
}