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