zoukankan      html  css  js  c++  java
  • [Swift]LeetCode1035.不相交的线 | Uncrossed Lines

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10783476.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    We write the integers of A and B (in the order they are given) on two separate horizontal lines.

    Now, we may draw a straight line connecting two numbers A[i] and B[j] as long as A[i] == B[j], and the line we draw does not intersect any other connecting (non-horizontal) line.

    Return the maximum number of connecting lines we can draw in this way.

    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. 1 <= A.length <= 500
    2. 1 <= B.length <= 500
    3. 1 <= A[i], B[i] <= 2000 

     我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。

    现在,我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。 

    以这种方法绘制线条,并返回我们可以绘制的最大连线数。

    示例 1:

    输入:A = [1,4,2], B = [1,2,4]
    输出:2
    解释:
    我们可以画出两条不交叉的线,如上图所示。
    我们无法画出第三条不相交的直线,因为从 A[1]=4 到 B[2]=4 的直线将与从 A[2]=2 到 B[1]=2 的直线相交。

    示例 2:

    输入:A = [2,5,1,2,5], B = [10,5,2,1,5,2]
    输出:3 

    示例 3:

    输入:A = [1,3,7,1,7,5], B = [1,9,2,5,1]
    输出:2

    提示: 

    1. 1 <= A.length <= 500
    2. 1 <= B.length <= 500
    3. 1 <= A[i], B[i] <= 2000

    76ms
     1 class Solution {
     2     func maxUncrossedLines(_ A: [Int], _ B: [Int]) -> Int {
     3         var dp = Array(repeating: Array(repeating: 0, count: B.count), count: A.count)        
     4         var res = 0        
     5         for row in 0 ..< A.count {
     6             for col in 0 ..< B.count {
     7                 dp[row][col] = max(col > 0 ? dp[row][col - 1] : 0, row > 0 ? dp[row - 1][col] : 0)
     8                 if A[row] == B[col] {
     9                     dp[row][col] = max(dp[row][col], col > 0 && row > 0 ? dp[row - 1][col - 1] + 1 : 1)
    10                     
    11                     res = max(res, dp[row][col])
    12                 }    
    13             }
    14         }
    15         return res
    16         
    17     }
    18 }

    Runtime: 84 ms

    Memory Usage: 18.7 MB 
     1 class Solution {
     2     func maxUncrossedLines(_ A: [Int], _ B: [Int]) -> Int {
     3         let n:Int = A.count
     4         let m:Int = B.count
     5         var dp:[[Int]] = [[Int]](repeating:[Int](repeating: 0, count:m + 1),count:n + 1)
     6         dp[0][0] = 0
     7         for i in 1...n
     8         {
     9             for j in 1...m
    10             {
    11                 if A[i - 1] == B[j - 1]
    12                 {
    13                     dp[i][j] = dp[i - 1][j - 1] + 1
    14                 }
    15                 else
    16                 {
    17                      dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    18                 }
    19             }
    20         }
    21         return dp[n][m]
    22     }
    23 }

    92ms

     1 class Solution {
     2     func maxUncrossedLines(_ A: [Int], _ B: [Int]) -> Int {                
     3         var dp = [[Int]](repeating: [Int](repeating: 0, count: B.count+1), count: A.count+1)
     4         for i in 1...A.count {
     5             for j in 1...B.count {
     6                 if A[i - 1] == B[j - 1] {
     7                     dp[i][j] = 1 + dp[i - 1][j - 1]
     8                 } else {
     9                     dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
    10                 }
    11             }
    12         }
    13         return dp[A.count][B.count]
    14     }
    15 }

    196ms

     1 class Solution {
     2     var dp = [[Int?]]()
     3     var arrA = [Int]()
     4     var arrB = [Int]()
     5     func maxUncrossedLines(_ A: [Int], _ B: [Int]) -> Int {
     6         arrA = A
     7         arrB = B
     8         dp = Array(repeating: Array(repeating: nil, count: B.count), count: A.count)
     9         
    10         return helper(startA: 0, startB: 0)
    11     }
    12     
    13     private func helper(startA: Int, startB: Int) -> Int {
    14         if let result = dp[startA][startB] {
    15             return result
    16         }
    17         
    18         if startA == arrA.count - 1 && startB == arrB.count - 1 {
    19             let result = arrA[startA] == arrB[startB] ? 1 : 0
    20             dp[startA][startB] = result
    21             return result
    22         }
    23         
    24         if startA == arrA.count - 1 || startB == arrB.count - 1{
    25             let a = arrA[startA]
    26             let b = arrB[startB]
    27             let result: Int
    28             if a == b {
    29                 result = 1
    30             } else if startA == arrA.count - 1 {
    31                 result = helper(startA: startA, startB: startB + 1)
    32             } else {
    33                 result = helper(startA: startA + 1, startB: startB)
    34             }
    35             
    36             dp[startA][startB] = result
    37             return result
    38         }
    39         
    40         let a = arrA[startA]
    41         let b = arrB[startB]
    42         let result: Int
    43         if a == b {
    44             result = helper(startA: startA + 1, startB: startB + 1) + 1
    45         } else {
    46             result = max(
    47                 helper(startA: startA + 1, startB: startB),
    48                 helper(startA: startA, startB: startB + 1)
    49             )
    50         }
    51         
    52         dp[startA][startB] = result
    53         return result
    54     }
    55 }
  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/strengthen/p/10783476.html
Copyright © 2011-2022 走看看