【问题标题】:Given two intervals find all non-overlapping intervals给定两个区间找到所有不重叠的区间
【发布时间】:2019-06-04 14:45:20
【问题描述】:

给定两个区间 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 个案例。但这似乎有点太乏味了。有没有更简单的实现方式?

谢谢

【问题讨论】:

  • 该列表不应该也包含区间[6, 6],即[2, 8]的非重叠部分吗?或者如果它不是零长度,包含这个吗?
  • 我更新了问题。
  • 会不会有独立区间这样的情况。例如: A = [1, 10] 和 B= [15, 20] ?否则,B 是否总是 A 的子集?
  • 如果您在浏览器中搜索“区间代数”,您会找到比我们在此处管理的更能解释这一点的参考资料。
  • @BishalG 我假设总会有重叠。

标签: arrays algorithm


【解决方案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])}
  } 
}

【讨论】:

  • 很好的解决方案,我正在做测试
【解决方案2】:

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

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

然后,遍历时间线并通过“开始”递增和“结束”递减来计算间隔的平衡。

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

【讨论】:

  • 您介意解释一下“区间平衡”一词的含义吗?
  • @hammerhead 开始间隔数减去结束间隔数。因此,通过时间线,当您遇到间隔开始时将余额增加 1,当您遇到结束时减少 1。
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多