You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测列表中子列表的重叠性并合并重叠区间?

嘿,这是个经典的区间合并问题,我来给你实现完全符合你需求的函数,还会附带详细解释和测试示例👇

解决方案:合并重叠/交错的区间

核心思路其实很简单:先把所有区间按起始值排序,这样我们就能依次检查每个区间和前一个合并后的区间是否重叠,然后逐步合并。

具体实现步骤

  • 排序区间:先将输入的所有子列表按区间的第一个元素(起始值)从小到大排序,这样相邻的区间要么重叠,要么完全不重叠,方便我们逐个处理。
  • 遍历合并:初始化一个结果列表,先放入排序后的第一个区间;然后遍历剩下的每个区间,和结果列表里的最后一个区间对比:
    • 如果当前区间的起始值 ≤ 最后一个合并区间的结束值,说明两者重叠或相邻,就把它们合并成一个新的区间(起始值取前者的起始,结束值取两者的最大值)。
    • 如果不满足上面的条件,说明两个区间完全不重叠,直接把当前区间加入结果列表。

Python代码实现

def merge_overlapping_intervals(intervals):
    # 处理空输入的边界情况
    if not intervals:
        return []
    
    # 按区间的起始值排序,确保我们可以顺序处理
    sorted_intervals = sorted(intervals, key=lambda x: x[0])
    merged = [sorted_intervals[0]]
    
    for current_interval in sorted_intervals[1:]:
        last_merged = merged[-1]
        # 判断当前区间是否和最后一个合并后的区间重叠/相邻
        if current_interval[0] <= last_merged[1]:
            # 合并区间:更新结束值为两者的最大值
            merged[-1] = [last_merged[0], max(last_merged[1], current_interval[1])]
        else:
            # 无重叠,直接加入结果列表
            merged.append(current_interval)
    
    return merged

测试你的示例

示例1:所有子列表都重叠

a = [[0.65, 0.71], [0.55, 0.65], [0.6, 0.66]]
print(merge_overlapping_intervals(a))  # 输出: [[0.55, 0.71]]

解释:排序后的区间是[[0.55, 0.65], [0.6, 0.66], [0.65, 0.71]],第一个和第二个合并为[0.55, 0.66],再和第三个合并成[0.55, 0.71],最终得到全局最小和最大值组成的区间。

示例2:部分子列表重叠

b = [[0.65, 0.71], [0.55, 0.65], [0.1, 0.2]]
print(merge_overlapping_intervals(b))  # 输出: [[0.1, 0.2], [0.55, 0.71]]

解释:排序后的区间是[[0.1, 0.2], [0.55, 0.65], [0.65, 0.71]],第一个区间和后面的完全不重叠,直接保留;后面两个合并成[0.55, 0.71],最终得到两个独立的区间。

额外说明

  • 这个函数兼容整数和浮点数区间,因为数值比较逻辑对类型没有限制。
  • 如果你的需求里相邻的区间不算重叠(比如[1,2][2,3]不需要合并),只需要把判断条件改成current_interval[0] < last_merged[1]即可。
  • 已经处理了空输入的情况,避免程序报错。

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

火山引擎 最新活动