返回
从初学者到进阶:合并区间算法详解
后端
2024-02-03 06:14:18
算法解析
合并区间算法的关键步骤如下:
- 排序区间: 将区间按照其左端点进行排序,以便于比较和合并相邻的区间。
- 初始化结果: 创建一个空的结果列表 result,用于存储合并后的区间。
- 遍历区间: 使用一个变量 prev 来记录上一个合并的区间。对于每个区间 interval,执行以下步骤:
- 如果 interval 与 prev 重叠,则将 interval 与 prev 合并。
- 否则,将 interval 添加到 result 列表中,并更新 prev 为 interval。
编程语言示例
Python
def merge(intervals):
"""
合并重叠的区间。
Args:
intervals: 区间列表,每个区间由其左端点和右端点表示。
Returns:
合并后的区间列表。
"""
# 对区间按左端点排序
intervals.sort(key=lambda x: x[0])
# 创建结果列表
result = []
# 初始化上一个合并的区间
prev = None
# 遍历区间
for interval in intervals:
# 如果当前区间与上一个区间重叠,则合并
if prev and interval[0] <= prev[1]:
prev[1] = max(prev[1], interval[1])
# 否则,将当前区间添加到结果列表中
else:
result.append(interval)
prev = interval
# 返回结果列表
return result
JavaScript
const merge = (intervals) => {
// 对区间按左端点排序
intervals.sort((a, b) => a[0] - b[0]);
// 创建结果列表
const result = [];
// 初始化上一个合并的区间
let prev = null;
// 遍历区间
for (const interval of intervals) {
// 如果当前区间与上一个区间重叠,则合并
if (prev && interval[0] <= prev[1]) {
prev[1] = Math.max(prev[1], interval[1]);
}
// 否则,将当前区间添加到结果列表中
else {
result.push(interval);
prev = interval;
}
}
// 返回结果列表
return result;
};
时间复杂度和空间复杂度
合并区间算法的时间复杂度为 O(n log n),其中 n 是区间列表的长度。这是因为需要对区间进行排序,排序的时间复杂度为 O(n log n)。合并过程的时间复杂度为 O(n),因为需要遍历区间列表。
合并区间算法的空间复杂度为 O(n),这是因为需要创建一个结果列表来存储合并后的区间。
结语
合并区间算法是一种重要的算法,在许多实际问题中都有应用。希望本指南能帮助你理解算法的原理和实现。如果你有其他问题,欢迎随时提出。