1035. 不相交的线

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

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

  •  nums1[i] == nums2[j]
  • 且绘制的直线不与任何其他连线(非水平线)相交。

请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

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

示例 1:

输入:nums1 = [1,4,2], nums2 = [1,2,4]
输出:2
解释:可以画出两条不交叉的线,如上图所示。 
但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。

示例 2:

输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
输出:3

示例 3:

输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
输出:2

提示:

  • 1 <= nums1.length, nums2.length <= 500
  • 1 <= nums1[i], nums2[j] <= 2000

思路

绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且直线不能相交!

直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。

拿示例一A = [1,4,2], B = [1,2,4]为例,相交情况如图:

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

这么分析完之后,大家可以发现:本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!

本题代码如下:

class Solution {
public:
    int maxUncrossedLines(vector<int>& A, vector<int>& B) {
        vector<vector<int>> dp(A.size() + 1, vector<int>(B.size() + 1, 0));
        for (int i = 1; i <= A.size(); i++) {
            for (int j = 1; j <= B.size(); j++) {
                if (A[i - 1] == B[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[A.size()][B.size()];
    }
};
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)
在ArcGIS中进行面转线(Polygon to Line)操作时,默认情况下会将面要素的边界转换为线要素,并在相邻面的公共边界上生成共享线段。然而,在某些情况下,特别是当输入面要素存在重叠或间隙时,生成的线可能会被意外打断,导致相交线被分割[^1]。为避免这种情况,可以采取以下策略来确保线要素在相交处不被打断: ### 1. 使用“融合”工具预处理面要素 在进行面转线操作之前,可以使用“融合”(Dissolve)工具将相邻的面要素合并为一个连续的面要素。这样可以减少边界线的复杂性,避免因边界不一致而导致线被错误打断。 ```python # 示例代码:使用ArcPy进行面要素融合 arcpy.Dissolve_management("面图层A", "面图层A_Dissolved", "", "", "SINGLE_PART", "") ``` ### 2. 设置“面转线”工具参数 在使用“面转线”工具时,确保正确设置参数。如果希望保留所有边界线(包括内部边界),应取消勾选“IDENTIFY_NEIGHBORS”选项。该选项用于识别相邻面并生成共享边界线,若不需要区分相邻关系,应关闭此功能[^1]。 ### 3. 后处理:使用“融合”或“合并”工具连接线要素 在完成面转线后,可以使用“融合”或“合并”(Merge)工具将被错误打断的线段重新连接。例如,使用“融合”工具根据线要素的属性字段进行合并,确保连续性。 ```python # 示例代码:使用ArcPy进行线要素融合 arcpy.Dissolve_management("线图层", "线图层_Dissolved", "属性字段", "", "SINGLE_PART", "") ``` ### 4. 使用“拓扑检查”工具确保线要素连续性 构建拓扑规则(如“不能重叠”、“必须不间隙”)来检查线要素的连续性和完整性。通过拓扑检查可以发现并修复线要素中的断裂或重叠问题。 ### 5. 利用“编辑器”工具手动修复断裂线 如果自动处理后仍存在断裂线,可以使用ArcGIS的“编辑器”工具手动连接线段。选择“编辑”模式后,使用“创建要素”或“修改要素”工具将断裂的线段连接起来。 ### 6. 使用“相交”工具保留线要素的交点 如果需要保留线要素之间的交点而不打断线,可以使用“相交”(Intersect)工具,并选择输出类型为“POINT”。这样可以在不改变线要素结构的前提下提取交点信息[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值