给出两个间隔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个案件。但这似乎有点乏味。有没有更简单的实现方法?
谢谢
答案 0 :(得分:1)
据我所知,输入将包含两个区间,例如A
和B
,我们必须找到所有两个区间均不共享的线性子段。
我们可能会观察到,将以最大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的所有间隔”,因为当您的余额等于1时,则意味着恰好有一个非重叠间隔。