计算交叉点所需多条直线的最快方法?

时间:2018-03-18 07:21:04

标签: algorithm big-o

我正在进行编码面试,虽然我能够解决它,但我的表现得分很低,我以为我会要求改进。

问题:

输入是图表上的点阵列。 E.g [(-1, -2), (1, 2), (2, 4), (2, 3)]

从点(0, 0)开始,您需要绘制多少条直线以交叉所有点?

解决方案:

我在O(n)中通过循环遍历所有点并将比率存储在集合中,然后返回集合中的项目数来解决这个问题。例如,(1, 2)(2, 4)具有相同的比率,因此一行可以通过它们。

你如何以比O(n)更快的方式解决这个问题?

我的代码:

def countRays(points):
  positiveRatios = set()
  negativeRatios = set()
  for point in points:
    x, y = point
    if x < 0 or y < 0:
      symbol = "-"
    else:
      symbol = "+"

    ratios = positiveRatios if x >= 0 else negativeRatios
    if x == 0:
      ratios.add( (symbol, 1,) )
    else:
      ratios.add( (symbol, y/x,) )
  return len(positiveRatios) + len(negativeRatios)

1 个答案:

答案 0 :(得分:2)

这不能比O(n)更快地解决。每个点都可以产生一个新的线,所以你必须至少看一次。

相关问题