在解决许多实际问题中,合并区间是一个常见的需求。例如,在规划日程安排时,需要将相邻的时间段合并;在处理地理空间数据时,也需要整合相邻的区域。本文主要介绍如何合并给定的一组区间的技巧和算法。
假设我们有一个包含多个区间的列表(或数组),每个区间表示为一个二元组 (start, end)
,任务是将所有重叠或者相邻的区间合并成尽可能少的几个区间。例如,对于输入 [[1, 3], [2, 6], [8, 10], [15, 18]]
,输出应该是 [[1, 6], [8, 10], [15, 18]]
。
解决这个问题的基本思路是按区间起点排序后遍历这些区间。具体步骤如下:
首先将所有区间按照起点进行升序排列,这样可以确保每次处理当前区间时,下一个要合并的区间必然在它的右边。
def sort_intervals(intervals):
intervals.sort(key=lambda x: x[0])
初始化一个空的结果列表 result
和第一个区间的起点和终点来代表当前处理中的合并区间。
current_start = intervals[0][0]
current_end = intervals[0][1]
遍历剩下的区间,对于每一个新的区间 (start, end)
:
start
大于当前区间的终点,则意味着没有重叠或相邻情况,需要将当前区间加入结果列表,并更新当前的起点和终点。for interval in intervals[1:]:
if interval[0] > current_end:
result.append([current_start, current_end])
current_start = interval[0]
current_end = interval[1]
else:
current_end = max(current_end, interval[1])
# 最后别忘了将最后一个区间加入结果列表
result.append([current_start, current_end])
最后返回合并后的结果列表。
def merge_intervals(intervals):
if not intervals:
return []
sort_intervals(intervals)
result = []
current_start = intervals[0][0]
current_end = intervals[0][1]
for interval in intervals[1:]:
if interval[0] > current_end:
result.append([current_start, current_end])
current_start = interval[0]
current_end = interval[1]
else:
current_end = max(current_end, interval[1])
result.append([current_start, current_end])
return result
下面是一个完整的示例代码,展示了如何调用上述函数来合并区间。
intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
merged_intervals = merge_intervals(intervals)
print(merged_intervals) # 输出: [[1, 6], [8, 10], [15, 18]]
通过上述方法,我们可以有效地合并区间以解决实际问题中的相关需求。这种方法简洁明了,在处理大量数据时也能保持较高的效率。