1035.不相交的线段

本文介绍了一种解决LeetCode上的1035题——不相交的线段的方法。通过动态规划策略,定义dp[i][j]表示nums1前i个数与nums2前j个数的最大连线数。当nums1[i]等于nums2[j]时,dp[i][j]等于dp[i-1][j-1]+1;否则,dp[i][j]取dp[i-1][j]和dp[i][j-1]中较大者。文章还提醒注意边界条件的处理,并提供了Java代码实现。
摘要由CSDN通过智能技术生成

题目:

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

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

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

解题思路:

遇到最大连接数问题首先想到动态规划。【动态规划】
定义dp[i][j]表示nums1前i个数与nums2前j个数可组成的最大连接数
如果nums1第i个和nums2第j个数字相同则dp[i][j]=dp[i-1][j-1]+1;如果能想到这一点后面就差不多能想出来了。

想一想其他情况怎么处理~

如果nums1第i和nums2第j个不相等,那说明最后面那根线段绝对不会同时用到第i和第j这两个数,最多用到其中之一,那么dp[i][j] = dp[i-1][j]或者dp[i][j-1],谁最大取谁。

动态规划另一个需要注意的问题,能把dp[i][j]的情况想到,其实就解决了,不用去钻dp[i][j-1]这些怎么求,因为你迭代到i,j时说明已经遍历过前面的值。考虑到i=0或j=0的边界赋值问题就可以了。

参考:

数据结构和算法1035.不相交的线段
Java代码

class Solution {
   
    pub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值