连线

 

题目:

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i]和 nums2[j]的直线,这些直线需要同时满足满足:

nums1[i] == nums2[j]
且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

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


示例 1:


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

输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
输出:3
示例 3:

输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
输出:2

 

 

代码:

 

复制代码
public int maxUncrossedLines(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        int[][] a = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++) {
            int a1 = nums1[i - 1];
            for (int j = 1; j <= n; j++) {
                int a2 = nums2[j - 1];
                if (a1 == a2) {
                    a[i][j] = a[i - 1][j - 1] + 1;
                } else {
                    a[i][j] = a[i - 1][j]>a[i][j - 1]?a[i - 1][j]:a[i][j - 1];
                }
            }
        }
        return a[m][n];
        }
复制代码

 

思路分析:这个思路来源于力扣上的一位大佬的启发,他说,如果可以把每一个点的结果不断的传递下去,那么最终我们就一定能得到一个确定的值,我根据这个想法,写出了下面的代码:

我们来看一个模型

以2维数组为一个坐标轴:

假设两个数组长度都为9,那么们画一个10*10的表格,也就是10*10的二维数组(两个数组的横竖无所谓),

按下面的代码来

注:这里我标的0,1,2这些数字是下标,实际上他们对应位置的值应该是0才对!

假设num1的第一个和num2的第一个相等,那么坐标为(1,1)的地方就等于坐标为(1-1,1-1)的地方加1,也就是1,然后无论是num1的第一个再和num2的其他任何数相等,这个数字都会被传递下去(这儿口述不出来,看代码吧)

 

就这样,依次传递到最后,满足题目条件的值就会出现在坐标为(9,9)的位置

0 1 2 3 4 5 6 7 8 9
1                  
2                  
3                  
4                  
5                  
6                  
7                  
8                  
9                  
posted @   牛杂刻师傅  阅读(200)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示