给定一组间隔,如何找到它们之间的最大交叉点数,

时间:2016-03-02 05:55:44

标签: arrays algorithm sorting data-structures

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

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

3 个答案:

答案 0 :(得分:4)

标准解决方案是将间隔处理为一组(开始,结束)点。例如(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)&amp; (1,2)不会被视为相交。否则它应该继续,并且这些间隔将计为相交的间隔。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

希望您发现这很有用:(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