连线
题目:
在两条独立的水平线上按给定的顺序写下 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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现