如何判断多条线段重叠并生成非重叠线段?
水平线段合并为非重叠线段的逻辑与实现

输入线段(均为水平线段,y坐标固定为4):
- [3,4],[5,4]
- [8,4],[20,4]
- [10,4],[15,4]
核心需求:
将重叠或互相包含的线段合并为单一线段,最终得到非重叠的独立线段(如示例中输出[3,4],[5,4]和[8,4],[20,4])。
背后的逻辑与数学原理
因为所有线段都是水平的(y坐标一致),只需处理x轴上的区间即可,核心是区间合并算法,步骤如下:
- 标准化线段区间:将每条线段的两个端点转换为
[左端点, 右端点],即取两个x坐标的最小值作为左端点,最大值作为右端点,避免输入坐标顺序颠倒的问题。 - 排序线段:按所有线段的左端点从小到大排序,确保后续遍历是有序的。
- 合并重叠/包含区间:
- 初始化结果列表,放入第一条标准化后的线段。
- 依次遍历剩余线段:
- 取当前线段与结果列表最后一条线段对比,若当前线段的左端点 ≤ 最后一条线段的右端点,说明两者重叠或包含,此时更新最后一条线段的右端点为两者右端点的最大值(实现合并)。
- 若当前线段的左端点 > 最后一条线段的右端点,说明无重叠,直接将当前线段加入结果列表。
示例中第三条线段[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
相关产品推荐
相关产品推荐

