给定n行(x1,x2),其中x1是起始点,x2是与x轴平行的行的终点。我们需要绘制一条垂直于X轴的直线,使其与最大线数(平行于X轴)相交。如何找到相交线的坐标和最大交叉数。
有人能提供一些解决这个问题的提示吗?
答案 0 :(得分:2)
除非线是拉伸(有限长度 - 我希望这是正确的术语),否则任何与X轴相关的线都将满足要求。假设它们是拉伸的:
define line: int x_l , int x_r //representation of a line (y-coordinates aren't necessary)
define mostLinesX:
input: list coords
output: xOpt
Map<Integer , Integer> growthMap
for line l in coords
put(growthMap , l.x_l , 1)
put(growthMap , l.x_r , -1)
int maxX = -1
int max = 0
int curCt = 0
for int i in sorted(growthMap.keys)
curCt += get(growthMap , i)
if curCt > max
maxX = i
max = curCt
return maxX
基本思路非常简单:定义一个函数f(x)
,它显示将与x
处的垂直线相交的行数。此函数的结果将是在x
之前开始的所有行的数量减去在x
之前结束的所有行的数量。现在,算法所要做的就是找到f(x)
的峰值。 x
始终是最小的可能值,因此无法找到与条件匹配的更大x
。
注意:行尾是独占的。因此,如果我们有一行(a , b)
,b
本身不属于该行 - 或换句话说:(a , a + 1)
长度为0。