我在CareerCup上找到了一道谷歌面试题。
给定一个二维平面,假设其上有大约6000个点。找到一条穿过最多点的直线。
许多答案都说这个问题很难,需要使用某些特殊算法。
但是我的观点不同,也许我是错的。
以下是我的想法:
首先我会为二维平面建立坐标系。因此,每个点都有其唯一的x和y,即{x, y}
。为了简单起见,我们可以将坐标系的{0, 0}
放在整个平面的左下角,因此每个x和y都大于0。
然后我有一个理论:
如果几个点在同一条直线上,则必须符合以下3种情况之一:
- 它们的
x
值相同 - 它们的
y
值相同 - 它们的
x/y
或y/x
值相同。但是x/y
情况与y/x
情况相同,因此让我们只关注x/y
。
然后我将有3个哈希表。
第一个(
hashtable-x
)的键为x
,值是具有相同x
的点的列表;第二个(
hashtable-y
)的键为y
,值是具有相同y
的点的列表;- 最后一个(
hashtable-x-y
)的键为x/y
,值是具有相同x/y
的点的列表;
好的,这里是重复的问题,很抱歉我之前没有找到这个问题。
x/y
比率只会考虑起点为{0, 0}
的线。想象所有的点都在直线上,其中y = x + 1
,它们都有另一个x
,另一个y
和另一个x/y
。 - Nobody moving away from SE