力扣-1035不相交的线(Java详细题解)

题目链接:力扣-1035不相交的线

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

其实本题刚入手会很懵,什么是不相交的线。

抽象来说就是本数组中与另一个数组相对应的一对数都在上一对相应的数的后面。

也就是只要他们的相对顺序不变。本对在上一对的后面,那么他们就不会相交。

举个例子。

在这里插入图片描述

其实也就是说A(上面一个数组)和B(下面的数组)的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面)

最大不相交的线的连线数就是俩个数组的最长公共子序列。

如果你做过1143. 最长公共子序列 - 力扣(LeetCode)并且看过我的这篇题解最长公共子序列,那么你会发现该题与力扣1143的代码完全类似,唯一不同的就是1143是字符串,本题是数组。

具体分析可以参照我的这篇题解最长公共子序列

这里我就直接给出最终代码了。

最终代码:

class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        //dp数组的定义
        int dp [][] = new int [nums1.length + 1][nums2.length + 1];
        //dp遍历顺序
        for(int i = 1;i <= nums1.length;i ++){
            for(int j = 1;j <= nums2.length;j ++){
                //递推公式
                if(nums1[i - 1] == nums2[j - 1]){
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }else{
                    dp[i][j] = Math.max(dp[i][j - 1],dp[i - 1][j]);
                }
            }
        }
        return dp[nums1.length][nums2.length];
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值