1035.Uncrossed Lines === ###### tags: `Medium`,`Array`,`DP` [1035. Uncrossed Lines](https://leetcode.com/problems/uncrossed-lines/) ### 題目描述 You are given two integer arrays `nums1` and `nums2`. We write the integers of `nums1` and `nums2` (in the order they are given) on two separate horizontal lines. We may draw connecting lines: a straight line connecting two numbers `nums1[i]` and `nums2[j]` such that: * `nums1[i]` == `nums2[j]`, and * the line we draw does not intersect any other connecting (non-horizontal) line. Note that a connecting line cannot intersect even at the endpoints (i.e., each number can only belong to one connecting line). Return *the maximum number of connecting lines we can draw in this way.* ### 範例 **Example 1:** ![](https://assets.leetcode.com/uploads/2019/04/26/142.png =60%x) ``` Input: nums1 = [1,4,2], nums2 = [1,2,4] Output: 2 Explanation: We can draw 2 uncrossed lines as in the diagram. We cannot draw 3 uncrossed lines, because the line from nums1[1] = 4 to nums2[2] = 4 will intersect the line from nums1[2]=2 to nums2[1]=2. ``` **Example 2:** ``` Input: nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2] Output: 3 ``` **Example 3:** ``` Input: nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1] Output: 2 ``` **Constraints**: * 1 <= `nums1.length`, `nums2.length` <= 500 * 1 <= `nums1[i]`, `nums2[j]` <= 2000 ### 解答 #### Javascript 讀完題目就覺得超像LCS,快速寫一個遞迴版本立刻TLE... 放上來給大家笑一下 ```javascript= function maxUncrossedLines(nums1, nums2) { const m = nums1.length; const n = nums2.length; function LCS(i, j) { if (i === m || j === n) return 0; if (nums1[i] === nums2[j]) { return LCS(i + 1, j + 1) + 1; } return Math.max(LCS(i + 1, j), LCS(i, j + 1)); } return LCS(0, 0); } ``` 下面這個才會過 ```javascript= function maxUncrossedLines(nums1, nums2) { const m = nums1.length; const n = nums2.length; const dp = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0)); for (let i = 1; i <= m; i++) { for (let j = 1; j <= n; j++) { if (nums1[i - 1] === nums2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } dp[i][j] = Math.max(dp[i][j], dp[i - 1][j], dp[i][j - 1]); } } return dp[m][n]; } ``` > [name=Marsgoat][time=May 11, 2023] ```c++= class Solution { public: int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) { int counter = 0; int start_y = 0; for (int x = 0 ; x< nums1.size(); x++) { for (int y = start_y; y<nums2.size(); y++) { if (nums1[x] == nums2[y]) { counter++; start_y = y + 1; break; } } } return counter; } }; ``` 上面這個會顯而易見的 Failed,我再想想 > [name=skylanly][time=May 12, 2023] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)