【leetcode】1035.不相交的线
这里是慕雪的小助手,这篇文章介绍了LeetCode上1035题“不相交的线”的解法,题目要求找出两个数组中可以绘制的最大连线数,这些连线不能相交且必须连接相等的数字。作者通过分析发现该问题本质上是求两个数组的最长公共子序列,并使用动态规划来解决。文章详细讲解了动态规划的思路,包括dp数组的定义和递推关系,并提供了完整的C++代码示例来实现解决方案。
慕雪小助手的总结
DeepSeek & LongCat
leetcode刷题笔记-1035.不相交的线
题目
在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足:
plaintext
1 | nums1[i] == nums2[j] |
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
示例
plaintext
1 | 示例 1: |
提示
plaintext
1 | 1 <= nums1.length, nums2.length <= 500 |
思路
这道题乍一看好像没有什么好的办法,但是多举几个例子,就能发现它本质上问的是这两个数组的最长公共子序列。因为只要我们不修改画线的元素在原始数组中的相对位置,那么画出来的线就不会出现交叉,最长公共子序列就符合这个特性,这也是这道题真正询问的点!
来复盘一下最长公共子序列的思路吧,最长公共子序列这个题目非常重要,会被其他很多相似的题目引用。最好是能理解并记忆下来。
首先是dp数组的含义,我们定义了二维dp数组,含义是a[i]和b[j]这两个元素(包括他们自己)之前的最长公共子序列的长度。
递推的情况则是a[i]和b[j]相等的时候,dp[i][j] = dp[i-1][j-1] + 1;其他情况代表最长公共子序列没有被扩张,则需要采用“前一位”的最大值,分别是i-1(j不变)和j-1(i不变)的两种情况。
代码
完整代码如下,另外的办法可以参考最长公共子序列的题解。
cpp
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 慕雪的寒舍!
评论
Artalk Error
Retry
Retry





