1035.不相交的线

🔃1035.不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:

nums1[i] == nums2[j] 且绘制的直线不与任何其他连线(非水平线)相交。 请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

以这种方法绘制线条,并返回可以绘制的最大连线数。

思路

基本思想

只有相等才能绘制一条直线,并且线不能相交,这与最长公共子序列是一样的思路,只不过描述成了划线的步骤,所以可以根据最长公共子序列的思路做题

没有连接的线说明他们俩不匹配,是多余的元素,去掉多余的元素不影响线的连接,但是不能改变元素的相对位置,相当于线不能交叉

1143题 最长公共子序列是一样的思路,只不过换了一个描述

执行流程

  1. 初始化dp数组
  2. 按照递推方程更新dp数组
  3. 返回最后的元素作为最终的结果

代码

根据以上分析,得出以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size()+1,
                                vector<int>(nums2.size()+1,0));
        for(int i=0;i<nums1.size();++i){
            for(int j=0;j<nums2.size();++j){
                if(nums1[i]==nums2[j]){
                    dp[i+1][j+1]=dp[i][j]+1;
                }else{//当前两个数无法连线
                    dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
                }
            }
        }
        return dp[nums1.size()][nums2.size()];
    }
};

总结

当前两个数可以连线,直接结果数+1

当前两个数无法连线,那么有一个数是多余的,只有一个多余,而不是至少一个多余,要想明白这个逻辑,因为是拿nums1中的一个元素与nums2中的所有元素依次比较,比较到一个不相等的位置,说明当前有一个元素多余,返回较长的公共子序列长度作为当前的结果