一.問題描述
Example 1:
Input: A = [1,4,2], B = [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 A[1]=4 to B[2]=4 will intersect the line from A[2]=2 to B[1]=2.
Example 2:
Input: A = [2,5,1,2,5], B = [10,5,2,1,5,2]
Output: 3
Example 3:
Input: A = [1,3,7,1,7,5], B = [1,9,2,5,1]
Output: 2
Note:
1 <= A.length <= 500
1 <= B.length <= 500
1 <= A[i], B[i] <= 2000
二.解決思路
這是一道動態規劃的題目,說實話我動態規劃寫的很少,所以花了很多時間去理解
本題主要是遍歷一條線上的點,然後與另一條線上的所有點判斷
dp[i]代表從A線到B線的0~i點的最大不相交線的數量
我們迭代A上的每一個點一步步更新dp[i]
在每一個迭代步,dp[i]的含義是,從A線的0-k點,到B線的0-i點最大的不相交線數量
A上的每個點迭代完,dp[lenB]則是完整的A線到B線的最不不相交線數量
感覺動態規劃還是很難解釋
紙上寫了三頁,你們儘量理解吧。。。不懂的評論
同時要注意一個線上的點只能與另外線上的一個點相連,這是爲啥第二個for循環反轉的原因
更多leetcode算法題解法請關注我的專欄leetcode算法從零到結束或關注我
歡迎大家一起套路一起刷題一起ac
三.源碼
開頭讓A作爲長度較長的那個是爲了減少計算量,算法複雜度是O(lenA*lenB^2),lenB小時間複雜度會小點,當然不做這步處理也能AC
class Solution:
def maxUncrossedLines(self, A: List[int], B: List[int]) -> int:
if len(A)<len(B):
tmp=A
A=B
B=tmp
lenA=len(A)
lenB=len(B)
dp=[0]*(lenB+1)
for i in range(lenA):
# pay attention to the reversion
for t in range(lenB)[::-1]:
if A[i]==B[t]:dp[t+1]=dp[t]+1
for k in range(lenB):
dp[k+1]=max(dp[k+1],dp[k])
return dp[lenB]