我正在进行编码面试,虽然我能够解决它,但我的表现得分很低,我以为我会要求改进。
输入是图表上的点阵列。 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)
答案 0 :(得分:2)
这不能比O(n)更快地解决。每个点都可以产生一个新的线,所以你必须至少看一次。