区间交集算法
字数 1237 2025-10-25 18:32:29

区间交集算法

题目描述:给定两个由闭区间组成的列表,每个区间列表都是成对不相交的,并且已经排序。请返回这两个区间列表的交集。

示例:
输入:firstList = [[0,2],[5,10],[13,23],[24,25]]
secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

解题步骤:

  1. 问题分析:
  • 我们需要找到两个区间列表中重叠的部分
  • 两个列表都已经按区间起点排序,且各自内部区间不相交
  • 交集的定义:两个区间[a,b]和[c,d]的交集是[max(a,c), min(b,d)],当且仅当max(a,c) ≤ min(b,d)
  1. 双指针解法思路:
  • 使用两个指针i和j分别遍历两个列表
  • 比较当前两个区间firstList[i]和secondList[j]
  • 计算它们的交集(如果存在)
  • 移动结束位置较早的那个区间的指针
  1. 详细步骤:
    步骤1:初始化i = 0, j = 0,结果列表result = []
    步骤2:当i < firstList.length且j < secondList.length时循环:
    a. 设A = firstList[i], B = secondList[j]
    b. 计算两个区间的重叠部分:
    start = max(A[0], B[0])
    end = min(A[1], B[1])
    d. 如果start ≤ end,说明有交集,将[start, end]加入结果
    e. 移动指针:比较A[1]和B[1]

    • 如果A[1] < B[1],i++(A区间结束更早)
    • 否则j++(B区间结束更早或同时结束)
  2. 示例推演:
    初始:i=0, j=0
    A=[0,2], B=[1,5] → 交集[1,2] → i++(因为2<5)

i=1, j=0
A=[5,10], B=[1,5] → 交集[5,5] → j++(因为5=5)

i=1, j=1
A=[5,10], B=[8,12] → 交集[8,10] → i++(因为10<12)

i=2, j=1
A=[13,23], B=[8,12] → 无交集 → j++(因为12<13)

i=2, j=2
A=[13,23], B=[15,24] → 交集[15,23] → i++(因为23<24)

i=3, j=2
A=[24,25], B=[15,24] → 交集[24,24] → j++(因为24=24)

i=3, j=3
A=[24,25], B=[25,26] → 交集[25,25] → i++,j++

  1. 算法复杂度:
  • 时间复杂度:O(m+n),其中m和n是两个列表的长度
  • 空间复杂度:O(1)(不考虑输出结果的空间)
区间交集算法 题目描述:给定两个由闭区间组成的列表,每个区间列表都是成对不相交的,并且已经排序。请返回这两个区间列表的交集。 示例: 输入:firstList = [ [ 0,2],[ 5,10],[ 13,23],[ 24,25] ] secondList = [ [ 1,5],[ 8,12],[ 15,24],[ 25,26] ] 输出:[ [ 1,2],[ 5,5],[ 8,10],[ 15,23],[ 24,24],[ 25,25] ] 解题步骤: 问题分析: 我们需要找到两个区间列表中重叠的部分 两个列表都已经按区间起点排序,且各自内部区间不相交 交集的定义:两个区间[ a,b]和[ c,d]的交集是[ max(a,c), min(b,d) ],当且仅当max(a,c) ≤ min(b,d) 双指针解法思路: 使用两个指针i和j分别遍历两个列表 比较当前两个区间firstList[ i]和secondList[ j ] 计算它们的交集(如果存在) 移动结束位置较早的那个区间的指针 详细步骤: 步骤1:初始化i = 0, j = 0,结果列表result = [ ] 步骤2:当i < firstList.length且j < secondList.length时循环: a. 设A = firstList[ i], B = secondList[ j ] b. 计算两个区间的重叠部分: start = max(A[ 0], B[ 0 ]) end = min(A[ 1], B[ 1 ]) d. 如果start ≤ end,说明有交集,将[ start, end ]加入结果 e. 移动指针:比较A[ 1]和B[ 1 ] 如果A[ 1] < B[ 1 ],i++(A区间结束更早) 否则j++(B区间结束更早或同时结束) 示例推演: 初始:i=0, j=0 A=[ 0,2], B=[ 1,5] → 交集[ 1,2] → i++(因为2 <5) i=1, j=0 A=[ 5,10], B=[ 1,5] → 交集[ 5,5 ] → j++(因为5=5) i=1, j=1 A=[ 5,10], B=[ 8,12] → 交集[ 8,10] → i++(因为10 <12) i=2, j=1 A=[ 13,23], B=[ 8,12] → 无交集 → j++(因为12 <13) i=2, j=2 A=[ 13,23], B=[ 15,24] → 交集[ 15,23] → i++(因为23 <24) i=3, j=2 A=[ 24,25], B=[ 15,24] → 交集[ 24,24 ] → j++(因为24=24) i=3, j=3 A=[ 24,25], B=[ 25,26] → 交集[ 25,25 ] → i++,j++ 算法复杂度: 时间复杂度:O(m+n),其中m和n是两个列表的长度 空间复杂度:O(1)(不考虑输出结果的空间)