leetcode每日一题
[1738] 找出第 K 大的异或坐标值
[1744] 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
[231] 2的幂
堆排复习
[461] 汉明距离
[1190] 反转每对括号间的子串
[1707] 与数组中元素的最大异或值
[810] 黑板异或游戏
[1035] 不相交的线
[692] 前K个高频单词
[872] 叶子相似的树
[1442] 形成两个异或相等数组的三元组数目
[993] 二叉树的堂兄弟节点
[421] 数组中两个数的最大异或值
[13] 罗马数字转整数
[12] 整数转罗马数字
[1269]. 停在原地的方案数
[1310] 子数组异或查询
[1734] 解码异或后的排列
本文档使用 MrDoc 发布
-
+
首页
[1035] 不相交的线
### [1035] 不相交的线 [力扣原题链接](https://leetcode-cn.com/problems/uncrossed-lines/) 在两条独立的水平线上按给定的顺序写下 `nums1` 和 `nums2` 中的整数。 现在,可以绘制一些连接两个数字 `nums1[i]` 和 `nums2[j]` 的直线,这些直线需要同时满足满足: * `nums1[i] == nums2[j]` * 且绘制的直线不与任何其他连线(非水平线)相交。 请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。 以这种方法绘制线条,并返回可以绘制的最大连线数。 **示例 1:** ![](/media/202105/2021-05-21_104204.png) <pre><strong>输入:</strong>nums1 = <span id="example-input-1-1">[1,4,2]</span>, nums2 = <span id="example-input-1-2">[1,2,4]</span> <strong>输出:</strong><span id="example-output-1">2</span> <strong>解释:</strong>可以画出两条不交叉的线,如上图所示。 但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。 </pre> **示例 2:** <pre><strong>输入:</strong>nums1 = <span id="example-input-2-1">[2,5,1,2,5]</span>, nums2 = <span id="example-input-2-2">[10,5,2,1,5,2]</span> <strong>输出:</strong><span id="example-output-2">3</span> </pre> **示例 3:** <pre><strong>输入:</strong>nums1 = <span id="example-input-3-1">[1,3,7,1,7,5]</span>, nums2 = <span id="example-input-3-2">[1,9,2,5,1]</span> <strong>输出:</strong><span id="example-output-3">2</span></pre> **提示:** * `1 <= nums1.length <= 500` * `1 <= nums2.length <= 500` * `<font face="monospace">1 <= nums1[i], nums2[i] <= 2000</font>` ### 题解 暴力解,基本上所以动规都可以用暴力递归+记表的方式解题。遍历第一个数组,暴力计算第一个数组在第二个数组每个值中出现可以划线的点,由于不能相交,下个点就是从第一个数组的下一个点开始循环遍历第二个数组的下一个点。 [动规解法题解](https://leetcode-cn.com/problems/uncrossed-lines/solution/bu-xiang-jiao-de-xian-by-leetcode-soluti-6tqz/) ### 代码 ```cpp class Solution { public: int helper(vector<int>& nums1,vector<int>& nums2,int begin_1,int begin_2,std::map<int,map<int,int>> &tmp_resurt) { if(begin_1 >= (int)nums1.size() || begin_2 >= (int)nums2.size()) return 0; //没有点可以连了 if(tmp_resurt.count(begin_1) > 0 && tmp_resurt[begin_1].count(begin_2) > 0) { return tmp_resurt[begin_1][begin_2]; } int max_count = 0; for(int i = begin_1; i < (int)nums1.size(); ++i) //遍历第一个数组 { for(int j = begin_2; j < (int)nums2.size(); ++j) //遍历第二个数组 { if(nums1[i] == nums2[j]) { int son_count = helper(nums1,nums2,i + 1, j + 1,tmp_resurt); //从第一条可以连线开始递归下一条 max_count = std::max(max_count,son_count + 1); //比较判断最大的连线数 } } } tmp_resurt[begin_1][begin_2] = max_count; //记表 return max_count; } int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) { //记表 映射关系为:第一个数组所在点,<第二个数组所在点,从第一个数组点到第二个数组点开始的最大连线> std::map<int,map<int,int>> tmp_resurt; return helper(nums1,nums2,0,0,tmp_resurt); } }; ```
ty
2021年5月21日 10:49
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
阅读量
次
本站总访问量
次
本站访客数
人次
Markdown文件
分享
链接
类型
密码
更新密码