You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断多条线段重叠并生成非重叠线段?

水平线段合并为非重叠线段的逻辑与实现

线段重叠示意图

输入线段(均为水平线段,y坐标固定为4):

  • [3,4],[5,4]
  • [8,4],[20,4]
  • [10,4],[15,4]

核心需求:

将重叠或互相包含的线段合并为单一线段,最终得到非重叠的独立线段(如示例中输出[3,4],[5,4]和[8,4],[20,4])。


背后的逻辑与数学原理

因为所有线段都是水平的(y坐标一致),只需处理x轴上的区间即可,核心是区间合并算法,步骤如下:

  1. 标准化线段区间:将每条线段的两个端点转换为[左端点, 右端点],即取两个x坐标的最小值作为左端点,最大值作为右端点,避免输入坐标顺序颠倒的问题。
  2. 排序线段:按所有线段的左端点从小到大排序,确保后续遍历是有序的。
  3. 合并重叠/包含区间:
    • 初始化结果列表,放入第一条标准化后的线段。
    • 依次遍历剩余线段:
      • 取当前线段与结果列表最后一条线段对比,若当前线段的左端点 ≤ 最后一条线段的右端点,说明两者重叠或包含,此时更新最后一条线段的右端点为两者右端点的最大值(实现合并)。
      • 若当前线段的左端点 > 最后一条线段的右端点,说明无重叠,直接将当前线段加入结果列表。

示例中第三条线段[10,4],[15,4]标准化后是[10,15],排序后在[8,20]之后,对比发现10 ≤ 20,因此合并后[8,20]保持不变,最终结果就是[3,5]和[8,20]对应的线段。


关于你尝试的重叠判断逻辑

你用到的A.start <= B.end && B.start <= A.end是判断两条线段是否重叠的正确逻辑,但仅做两两判断无法直接得到最终的非重叠线段,需要结合上述区间合并的流程,才能在线段数量增多时依然高效处理。

内容的提问来源于stack exchange,提问作者Buzz Su

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:15:41