【问题标题】:Given a set of intervals, how to find the maximum number of intersections among them,给定一组区间,如何找到它们之间的最大交集数,
【发布时间】:2016-03-02 05:55:44
【问题描述】:

假设给定一组区间 (1,5)、(6,10)、(3,8)、(7,9)。我期望的输出是 3,因为最多有 3 个区间 (3,8)、(6,10) 和 (7,9) 彼此相交。请注意,(1,5) 和 (3,8) 也相互交叉,但这只是其中的 2 个。所以这里的答案是 3,因为 3 是彼此相交的最大区间数。

有哪些有效的方法可以找到它?我想第一步是根据起始值对间隔进行排序。之后有什么建议吗?

【问题讨论】:

  • 这是一个标准的面试问题,被问和回答了数百次。发帖前请先搜索一下。

标签: arrays algorithm sorting data-structures


【解决方案1】:

标准解决方案是将间隔处理为一组(开始,结束)点。例如(1,3) 生成{1, begin}{3, end}。然后对点进行排序并从左到右扫描,将begin计为+1,end计为-1。计数器达到的最大值是重叠间隔的最大数量。

这是问题中的示例生成的中间数组:

[(1, 'begin'),
 (3, 'begin'),
 (5, 'end'),
 (6, 'begin'),
 (7, 'begin'),  # <--- counter reaches 3, its maximum value here.
 (8, 'end'),
 (9, 'end'), (10, 'end')]

这里有一个小技巧。 (1,end) 是在 (1,begin) 之前还是之后?如果您将间隔视为开放,那么它应该在前面 - 这样(0,1)(1,2) 将不会被视为相交。否则它应该继续,这些间隔将被视为相交的间隔。

【讨论】:

    【解决方案2】:

    好吧,您可以根据开始对间隔进行排序,如果您有: (1,5) , (4,8) , (2,3)

    它们将被排序: (1,5) , (2,3) , (4,8)

    然后您将检查每个间隔的开始与您找到的最高结束 如果起点小于终点,则有一个交叉点

    int highestEnd = intervals[0].end; // The highest end would be the end of the first interval
    int numOfIntersections = 0;
    for(int i = 1; i < intervalsSize; i++){
        if(intervals[i].start < highestEnd)
             numOfIntersections++;
        if(intervals[i].end > highestEnd)
             highestEnd = intervals[i].end;
    }
    

    【讨论】:

    • 感谢您的回答。但是,我认为这里有一个缺陷。在您的解决方案中,您永远不会重置变量 numberOfIntersections。假设排序后看起来像这样:(1,5),(3,8),(7,10),(15,20),(17,25),(23,28),(25,30) .在这里,您的算法将输出 7,而预期答案是 4。前 3 个元组在交集,最后 4 个元组在交集,但这两组是不相交的。我认为在您的算法中,每当条件 intervals[i].start &lt; highestEnd 失败时,我们应该将“numberOfIntersections”设置为 0。
    【解决方案3】:

    希望你觉得这很有用:(python 代码)- 测试工作正常 概述:我根据开始排序,找到了间隔的结束时间的最小值

    def max_intersections(intervals):
    max_simultaneous = 0
    intersections = 0
    smallest_end = intervals[0].end
    intervals.sort(key=lambda x: x.start)
    for i in range(len(intervals)):
        if intervals[i].start < smallest_end:
            smallest_end = min(smallest_end, intervals[i].end)
            intersections += 1
        else:
            max_simultaneous = max(max_simultaneous, intersections)
    return max_simultaneous
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多