【问题标题】:Insert Interval into a disjoint set of intervals将区间插入一组不相交的区间
【发布时间】:2013-01-22 17:33:14
【问题描述】:

给定已排序的不相交集(p,q),其中‘p’ 是开始时间,‘q’ 是结束时间。您将获得一个输入间隔。将其插入正确的位置。并返回结果排序的不相交集。

Eg: (1,4);(5,7);(8,10);(13,18)

Input interval – (3,7)
Result : (1,7);(8,10);(13,18)

Input Interval – (1,3)
Result: (1,4);(5,7);(8,10);(13,18)

Input interval – (11,12)
Result: (1,4);(5,7);(8,10);(11,12);(13,18)

Inserting an interval in a sorted list of disjoint intervals,这里没有有效的答案

【问题讨论】:

  • 你假设你的初始区间是有序的吗?如果有,怎么做?
  • 排序为 in ,它们是不相交的,在数字行之前的间隔更早
  • @HighPerformanceMark ,请参阅示例以获得更清晰的问题
  • 这个问题在这里有更丰富的讨论:stackoverflow.com/questions/34837663/…

标签: algorithm


【解决方案1】:

您的问题和示例暗示了不重叠的间隔。在这种情况下,您只需执行 binary search - 比较是按开始时间还是结束时间对非重叠间隔无关紧要 - 并在找到的位置插入新间隔(如果不存在)。

更新

我错过了第一个示例中发生的合并。一个不好的情况是将一个大间隔插入到一个长的短间隔列表中,其中长间隔与许多短间隔重叠。为了避免对所有必须合并的区间进行线性搜索,可以执行两次二分搜索 - 一次从左侧比较开始时间,另一次从右侧比较结束时间。

现在决定间隔是否存在、是否必须插入或是否必须与两次搜索找到的位置之间的间隔合并是微不足道的。虽然这不是很复杂,但它可能很容易出现off-by-one errors,并且需要进行一些测试。

【讨论】:

  • 如第一个示例所示,您可能还必须合并区间。无论如何,如果对原始间隔进行排序,这仍然是一项简单的任务;)
  • 我要补充一点,如果您的间隔与已经存在的间隔重叠,您可以在插入点合并间隔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2015-06-26
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多