LeetCode1035. 不相交的線

堅果-果發表於2019-06-27

LeetCode1035. 不相交的線

題目說明

我們在兩條獨立的水平線上按給定的順序寫下 A 和 B 中的整數。

現在,我們可以繪製一些連線兩個數字 A[i] 和 B[j] 的直線,只要 A[i] == B[j],且我們繪製的直線不與任何其他連線(非水平線)相交。

以這種方法繪製線條,並返回我們可以繪製的最大連線數。

示例 1
LeetCode1035. 不相交的線
輸入:A = [1,4,2], B = [1,2,4]
輸出:2
解釋:
我們可以畫出兩條不交叉的線,如上圖所示。
我們無法畫出第三條不相交的直線,因為從 A[1]=4 到 B[2]=4 的直線將與從 A[2]=2 到 B[1]=2 的直線相交。

示例 2:
輸入:A = [2,5,1,2,5], B = [10,5,2,1,5,2]
輸出:3

示例 3:
輸入:A = [1,3,7,1,7,5], B = [1,9,2,5,1]
輸出:2

題目分析

這裡主要是利用了動態規劃裡面的最大公共子序列,然後得出遞迴的公式,按照公式進行書寫程式碼就可以。
下圖是最大公共子序列的狀態轉移方程。
最大公共子序列
需要注意的是定義的dp是從1開始,而訪問的元素xix_iyiy_i是從零開始,因此需要將改變相應的元素下標。

參考程式碼

class Solution {
public:
    int maxUncrossedLines(vector<int>& A, vector<int>& B) {
        int m = A.size(), n = B.size();
        //建立一個二維陣列,注意定義方法
        vector< vector<int> > dp( m+1,vector<int>(n+1));
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if( A[i] == B[j]) 
                    dp[i+1][j+1] = dp[i][j] +1;  
                else
                    dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j]);
            }
        }
        return dp[m][n];
    }
};

參考:https://www.jianshu.com/p/096c945be66b

相關文章