找到相交的最大行数

时间:2015-05-28 02:20:04

标签: algorithm data-structures dynamic-programming

给定n行(x1,x2),其中x1是起始点,x2是与x轴平行的行的终点。我们需要绘制一条垂直于X轴的直线,使其与最大线数(平行于X轴)相交。如何找到相交线的坐标和最大交叉数。

有人能提供一些解决这个问题的提示吗?

1 个答案:

答案 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。