美文网首页
LeetCode 1035. 不相交的线

LeetCode 1035. 不相交的线

作者: 草莓桃子酪酪 | 来源:发表于2022-08-13 09:33 被阅读0次
    题目

    在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足:

    • nums1[i] == nums2[j]
    • 且绘制的直线不与任何其他连线(非水平线)相交。

    请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
    以这种方法绘制线条,并返回可以绘制的最大连线数。

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

    方法:动态规划

    思路同 1143. 最长公共子序列
    根据直线需要满足的两个条件我们可以推断出,两组连线成功的数字需在相对顺序上相同,这样才能实现直线的不相交。那么根据子序列的定义:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串,此时将转化成求两个数组的最长公共子序列

    class Solution(object):
        def maxUncrossedLines(self, nums1, nums2):
            dp = [[0] * (len(nums2)+1) for row in range(len(nums1)+1)]
            for i in range(1, len(nums1)+1):
                for j in range(1, len(nums2)+1):
                    if nums1[i-1] == nums2[j-1]:
                        dp[i][j] = dp[i-1][j-1] + 1
                    else:
                        dp[i][j] = max(dp[i][j-1], dp[i-1][j])
            return dp[-1][-1]
    
    参考

    代码相关:https://programmercarl.com/1035.%E4%B8%8D%E7%9B%B8%E4%BA%A4%E7%9A%84%E7%BA%BF.html

    相关文章

      网友评论

          本文标题:LeetCode 1035. 不相交的线

          本文链接:https://www.haomeiwen.com/subject/fqmowrtx.html