Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 给定一组区间,如何找到它们之间的最大交点数,_Arrays_Algorithm_Sorting_Data Structures - Fatal编程技术网

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

Arrays 给定一组区间,如何找到它们之间的最大交点数,,arrays,algorithm,sorting,data-structures,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是相互相交的最大间隔数 有哪些有效的方法可以找到它?我想第一步是根据起始值对间隔进行排序。之后有什么建议吗?好吧,您可以根据开始时间对间隔进行排序,因此如果您有: (1,5)、(4,8)、(2,3) 它们将被分类: (1,5)、(2,3)、(4,8) 然后,您将检查每个

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


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

好吧,您可以根据开始时间对间隔进行排序,因此如果您有: (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;
}
int highestEnd=间隔[0]。结束;//最高终点将是第一个区间的终点
int NUMOF=0;
对于(int i=1;i高位结束)
highestEnd=间隔[i]。结束;
}

标准解决方案是将间隔处理为一组(开始、结束)点。例如
(1,3)
生成
{1,begin}
{3,end}
。然后对点进行排序并从左向右扫描,将
begin
as+1、
end
as-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,“开始”),
(3,'开始'),
(5,“结束”),
(6,'开始'),

(7,'begin'),#希望您发现这很有用:(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
def max_交点(间隔):
最大值=0
交点=0
最小\u end=间隔[0]。结束
interval.sort(key=lambda x:x.start)
对于范围内的i(len(间隔)):
如果间隔[i]。开始<最小值\u结束:
最小端=最小(最小端,间隔[i].end)
交点+=1
其他:
最大同步=最大(最大同步,交叉点)
返回最大值

这是一个标准的面试问题,询问和回答了数百次。请在发布前尝试搜索。感谢您的回答。但是,我认为这里有一个缺陷。在您的解决方案中,您从未重置变量
NumberOfCrossips
。假设排序后它看起来是这样的:(1,5),(3,8),(7,10),(15,20),(17,25),(23,28),(25,30)。在这里,您的算法将输出7,而预期的答案是4。前3个元组相交,后4个元组相交,但这两组是不相交的。我认为在您的算法中,只要条件
间隔[I].start
失败,我们应该将“NumberOfCrossons”设置为0。