【发布时间】:2017-05-05 19:25:57
【问题描述】:
我正在尝试解决一个编程面试问题,该问题需要找到位于 2D 平面中同一直线上的最大点数。我在网上查找了解决方案。他们都讨论了使用散列的 O(N^2) 解决方案,例如此链接中的解决方案:Here
我了解使用公共梯度来检查共线点的部分,因为这是一种常见的数学技术。但是,解决方案指出,必须注意垂直线和重叠点。我不确定这些点如何导致问题?我不能将垂直线的渐变存储为无穷大(一个大数)吗?
【问题讨论】:
我正在尝试解决一个编程面试问题,该问题需要找到位于 2D 平面中同一直线上的最大点数。我在网上查找了解决方案。他们都讨论了使用散列的 O(N^2) 解决方案,例如此链接中的解决方案:Here
我了解使用公共梯度来检查共线点的部分,因为这是一种常见的数学技术。但是,解决方案指出,必须注意垂直线和重叠点。我不确定这些点如何导致问题?我不能将垂直线的渐变存储为无穷大(一个大数)吗?
【问题讨论】:
提示:
如果
,三个不同的点共线x_1*(y_2-y_3)+x_2*(y_3-y_1)+x_3*(y_1-y_2) = 0
无需检查斜坡或其他任何东西。不过,您需要在搜索开始之前从集合中消除重复点。
因此选择一对点,然后找到所有其他共线的点并将它们存储在线列表中。对于剩余的点做同样的事情,然后比较哪条线的点数最多。
你第一次有n-2 测试。第二次你有n-4 测试,因为重新审视前两点是没有意义的。下次n-6 等,总共进行n/2 测试。在最坏的情况下,这会导致(n/2)*(n/2-1) 操作的复杂度为O(n^2)。
附言。曾经决定规范答案是使用斜率的人对平面几何知之甚少。人们发明了平面上的点和线的齐次坐标,正是为了表示垂直线和其他退化情况。
【讨论】:
O(n^2) 操作。请参阅答案编辑。