返回

从初学者到进阶:合并区间算法详解

后端

算法解析

合并区间算法的关键步骤如下:

  1. 排序区间: 将区间按照其左端点进行排序,以便于比较和合并相邻的区间。
  2. 初始化结果: 创建一个空的结果列表 result,用于存储合并后的区间。
  3. 遍历区间: 使用一个变量 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),这是因为需要创建一个结果列表来存储合并后的区间。

结语

合并区间算法是一种重要的算法,在许多实际问题中都有应用。希望本指南能帮助你理解算法的原理和实现。如果你有其他问题,欢迎随时提出。