88
99[ 力扣题目链接] ( https://leetcode.cn/problems/uncrossed-lines/ )
1010
11- 我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。
11+ 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
1212
13- 现在,我们可以绘制一些连接两个数字 A [ i] 和 B [ j] 的直线,只要 A [ i ] == B [ j ] ,且我们绘制的直线不与任何其他连线(非水平线)相交。
13+ 现在,可以绘制一些连接两个数字 nums1 [ i] 和 nums2 [ j] 的直线,这些直线需要同时满足:
1414
15- 以这种方法绘制线条,并返回我们可以绘制的最大连线数。
15+ * nums1[ i] == nums2[ j]
16+ * 且绘制的直线不与任何其他连线(非水平线)相交。
17+
18+ 请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
19+
20+ 以这种方法绘制线条,并返回可以绘制的最大连线数。
1621
1722
1823![ 1035.不相交的线] ( https://code-thinking-1253855093.file.myqcloud.com/pics/2021032116363533.png )
2631
2732相信不少录友看到这道题目都没啥思路,我们来逐步分析一下。
2833
29- 绘制一些连接两个数字 A [ i] 和 B [ j] 的直线,只要 A [ i] == B [ j] ,且直线不能相交!
34+ 绘制一些连接两个数字 nums1 [ i] 和 nums2 [ j] 的直线,只要 nums1 [ i] == nums2 [ j] ,且直线不能相交!
3035
31- 直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列 ,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交 。
36+ 直线不能相交,这就是说明在字符串nums1中 找到一个与字符串nums2相同的子序列 ,且这个子序列不能改变相对顺序,只要相对顺序不改变,连接相同数字的直线就不会相交 。
3237
33- 拿示例一A = [ 1,4,2] , B = [ 1,2,4] 为例,相交情况如图:
38+ 拿示例一nums1 = [ 1,4,2] , nums2 = [ 1,2,4] 为例,相交情况如图:
3439
3540
3641![ ] ( https://code-thinking-1253855093.file.myqcloud.com/pics/20210914145158.png )
3742
38- 其实也就是说A和B的最长公共子序列是 [ 1,4] ,长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面 )
43+ 其实也就是说nums1和nums2的最长公共子序列是 [ 1,4] ,长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串nums1中数字1的后面,那么数字4也应该在字符串nums2数字1的后面 )
3944
4045这么分析完之后,大家可以发现:** 本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!**
4146
5257``` CPP
5358class Solution {
5459public:
55- int maxUncrossedLines(vector<int >& A , vector<int >& B ) {
56- vector<vector<int >> dp(A .size() + 1, vector<int >(B .size() + 1, 0));
57- for (int i = 1; i <= A .size(); i++) {
58- for (int j = 1; j <= B .size(); j++) {
59- if (A [ i - 1] == B [ j - 1] ) {
60+ int maxUncrossedLines(vector<int >& nums1 , vector<int >& nums2 ) {
61+ vector<vector<int >> dp(nums1 .size() + 1, vector<int >(nums2 .size() + 1, 0));
62+ for (int i = 1; i <= nums1 .size(); i++) {
63+ for (int j = 1; j <= nums2 .size(); j++) {
64+ if (nums1 [ i - 1] == nums2 [ j - 1] ) {
6065 dp[ i] [ j ] = dp[ i - 1] [ j - 1 ] + 1;
6166 } else {
6267 dp[ i] [ j ] = max(dp[ i - 1] [ j ] , dp[ i] [ j - 1 ] );
6368 }
6469 }
6570 }
66- return dp[ A .size()] [ B .size()] ;
71+ return dp[ nums1 .size()] [ nums2 .size()] ;
6772 }
6873};
6974```
@@ -110,11 +115,11 @@ public:
110115
111116``` python
112117class Solution :
113- def maxUncrossedLines (self , A : List[int ], B : List[int ]) -> int :
114- dp = [[0 ] * (len (B )+ 1 ) for _ in range (len (A )+ 1 )]
115- for i in range (1 , len (A )+ 1 ):
116- for j in range (1 , len (B )+ 1 ):
117- if A [i- 1 ] == B [j- 1 ]:
118+ def maxUncrossedLines (self , nums1 : List[int ], nums2 : List[int ]) -> int :
119+ dp = [[0 ] * (len (nums2 )+ 1 ) for _ in range (len (nums1 )+ 1 )]
120+ for i in range (1 , len (nums1 )+ 1 ):
121+ for j in range (1 , len (nums2 )+ 1 ):
122+ if nums1 [i- 1 ] == nums2 [j- 1 ]:
118123 dp[i][j] = dp[i- 1 ][j- 1 ] + 1
119124 else :
120125 dp[i][j] = max (dp[i- 1 ][j], dp[i][j- 1 ])
@@ -124,23 +129,22 @@ class Solution:
124129### Go:
125130
126131``` go
127- func maxUncrossedLines (A []int , B []int ) int {
128- m , n := len (A), len (B)
129- dp := make ([][]int , m+1 )
132+ func maxUncrossedLines (nums1 []int , nums2 []int ) int {
133+ dp := make ([][]int , len (nums1) + 1 )
130134 for i := range dp {
131- dp[i] = make ([]int , n+ 1 )
135+ dp[i] = make ([]int , len (nums2) + 1 )
132136 }
133137
134- for i := 1 ; i <= len (A ); i++ {
135- for j := 1 ; j <= len (B ); j++ {
136- if (A [i - 1 ] == B [j - 1 ]) {
138+ for i := 1 ; i <= len (nums1 ); i++ {
139+ for j := 1 ; j <= len (nums2 ); j++ {
140+ if (nums1 [i - 1 ] == nums2 [j - 1 ]) {
137141 dp[i][j] = dp[i - 1 ][j - 1 ] + 1
138142 } else {
139143 dp[i][j] = max (dp[i - 1 ][j], dp[i][j - 1 ])
140144 }
141145 }
142146 }
143- return dp[m][n ]
147+ return dp[len (nums1)][ len (nums2) ]
144148
145149}
146150
0 commit comments