leetcode 1035. Uncrossed Lines(不交叉的线)

该问题通过动态规划解决,使用二维DP数组dp[i][j]记录nums1到i和nums2到j的最大连线数。当nums1[i]等于nums2[j]时,dp[i][j]=dp[i-1][j-1]+1,否则取dp[i-1][j]和dp[i][j-1]的较大值。

在这里插入图片描述

把数组nums1和nums2的元素排成2行,
从左到右把相同的元素连线,但是任意2条线不能交叉。
比如Example1中,可以连2个4,也可以连2个2,但是不能同时连,因为会交叉。
找出最多的连线数。

思路:

一开始会想从左到右遍历nums1中的数字,依次在nums2中找到对应的,
且只在nums2上一个数字的右边找下一个数字。
这么做是能找到其中一种情况的连线数,但是不一定能找到最大连线数。
比如:

1  2  3  4
2  3  4  1

第一次连1,直接连到了nums2的末尾,那下一次就无法再连线了。
而最大的连线数是3,也就是不连1,只连2,3,4.

所以需要找的是连于不连的选择间,最大的连线数。因此要用到DP,记录到每个位置 i 为止的最大连线数。
用二维DP,dp[ i ][ j ]表示nums1到i为止,nums2到 j 为止的最大连接数。
那么如果nums1[ i ] == nums2[ j ], 需要在dp[i-1][j-1]的连线数上增加一个,
即dp[ i ][ j ] = dp[i-1][j-1]+1.
如果nums1[i]和nums2[j]不相等,那么保留之前的连线数,需要取dp[i-1][j]和dp[i][j-1]较大的一个。

public int maxUncrossedLines(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值