我在CareerCup上找到了一个 Google 面试问题
给定一个二维平面,假设上面有大约 6000 个点。找到通过最多点数的线。
那里的许多答案说这个问题很难并且涉及某种特殊算法。
但我的观点不同,也许我错了。
这是我的想法:
首先,我将为 2D 平面提供一个轴系。因此,每个点都有其唯一的 x 和 y,即{x, y}
。为简单起见,我们可以将轴系{0, 0}
作为整个平面的左下角,因此每个 x 和 y 都大于 0。
然后我有一个理论:
如果几个点在同一条线上,那么它必须是以下三种情况之一:
- 它们的
x
值相同 - 它们的
y
值相同 - 它们的
x/y
或y/x
值相同。但是x/y
case 和 case 是一样的y/x
,所以我们只关注x/y
.
然后我将有 3 个哈希表。
第一个 (
hashtable-x
) 是 key ofx
,value 是相同点的列表x
;第二个(
hashtable-y
)是键,y
值是具有相同点的列表y
;- 最后一个(
hashtable-x-y
)是键,x/y
值是具有相同点的列表x/y
;
然后我扫描整个 6000 个点,对于每个点,我将得到它的x
from hashtable-x
,并将该点放入该插槽的值(列表)中;hashtable-y
然后我会对and做类似的事情hashtable-x-y
。
最后,我将扫描 3 个哈希表中的所有列表,并找到最长的列表将包含所需行的点。
你觉得我的算法怎么样?
好的,这是重复的,抱歉我之前没有找到这个问题。