如何检测列表中子列表的重叠性并合并重叠区间?
嘿,这是个经典的区间合并问题,我来给你实现完全符合你需求的函数,还会附带详细解释和测试示例👇
解决方案:合并重叠/交错的区间
核心思路其实很简单:先把所有区间按起始值排序,这样我们就能依次检查每个区间和前一个合并后的区间是否重叠,然后逐步合并。
具体实现步骤
- 排序区间:先将输入的所有子列表按区间的第一个元素(起始值)从小到大排序,这样相邻的区间要么重叠,要么完全不重叠,方便我们逐个处理。
- 遍历合并:初始化一个结果列表,先放入排序后的第一个区间;然后遍历剩下的每个区间,和结果列表里的最后一个区间对比:
- 如果当前区间的起始值 ≤ 最后一个合并区间的结束值,说明两者重叠或相邻,就把它们合并成一个新的区间(起始值取前者的起始,结束值取两者的最大值)。
- 如果不满足上面的条件,说明两个区间完全不重叠,直接把当前区间加入结果列表。
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




