给定两个间隔,找到所有不重叠的间隔

时间:2019-06-04 14:45:20

标签: arrays algorithm

给出两个间隔A = [1,10]和B = [3,7]。返回所有不重叠的间隔,因此结果将为[1、2]和[8、10]

假设A和B之间始终存在重叠。

我尝试将问题分解为多个案例: 假设您要查找A和B之间的非重叠间隔。

Case 1:
  A = [0, 5] and B = [2, 3]. 
  The result would be [0, 1] and [4, 5]. 
  General case: 
    if A[0] < B[0] and B[1] < A[1] 
    then [A[0], B[0] - 1] and [B[1] + 1, A[1]]

Case 2:
  A = [0, 5] and B = [0, 5].
  The result would be [].
  General case: 
    if A[0] == B[0] and B[1] == A[1] 
    then []

                      .
                      .
                      .   

我继续提出另外4个案件。但这似乎有点乏味。有没有更简单的实现方法?

谢谢

2 个答案:

答案 0 :(得分:1)

据我所知,输入将包含两个区间,例如AB,我们必须找到所有两个区间均不共享的线性子段。

我们可能会观察到,将以最大2个间隔作为解决方案。我们可以通过检查以下条件来打印解决方案:

if (A[0] > B[1] || B[0] > A[1]) { // for non-intersecting independent intervals
     print: {A[0], A[1]} and {B[0], B[1]}
} else {
  if (A[0] != B[0]) {
     print: {min(A[0], B[0]), max(A[0], B[0]) - 1}
  }
  if (A[1] != B[1]) {
     print: {min(A[1], B[1]) + 1, max(A[1], B[1])}
  } 
}

答案 1 :(得分:0)

通过将所有事件放在一个线性时间轴上并按升序对其进行排序,将输入转换为以下格式:

  • 间隔从1开始
  • 间隔从3开始
  • 时间间隔在7结束
  • 时间间隔在10结束

然后,通过时间轴并通过增加“开始”和减少“结束”来计数间隔的平衡。

现在,该任务可以改写为“输出余额等于1的所有间隔”,因为当您的余额等于1时,则意味着恰好有一个非重叠间隔。