【发布时间】:2014-01-13 18:23:50
【问题描述】:
以下是我正在尝试实施的解决方案
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
public class Solution {
public int maxPoints(Point[] points) {
int max=0;
if(points.length==1)
return 1;
for(int i=0;i<points.length;i++){
for(int j=0;j<points.length;j++){
if((points[i].x!=points[j].x)||(points[i].y!=points[j].y)){
int coll=get_collinear(points[i].x,points[i].y,points[j].x,points[j].y,points);
if(coll>max)
max=coll;
}
else{
**Case where I am suffering**
}
}
}
return max;
}
public int get_collinear(int x1,int y1,int x2, int y2,Point[] points)
{
int c=0;
for(int i=0;i<points.length;i++){
int k1=x1-points[i].x;
int l1=y1-points[i].y;
int k2=x2-points[i].x;
int l2=y2-points[i].y;
if((k1*l2-k2*l1)==0)
c++;
}
return c;
}
}
它以 O(n^3) 运行。我基本上在做的是运行两个循环比较二维平面中的各个点。然后取 2 个点,我将这 2 个点发送到 get_collinear 方法,该方法将这 2 个点与数组的所有元素形成的线相撞,以检查 3 个点是否共线。我知道这是一种蛮力方法。但是,如果输入为 [(0,0),(0,0)],我的结果将失败。 else 循环是我必须添加一个条件来找出这种情况的地方。有人可以帮我解决这个问题。并且在更好的运行时间是否存在更好的解决方案来解决这个问题。我想不出来。
【问题讨论】:
-
你不能设置一个所有非唯一点的哈希表吗?假设您有三个点 {(0,0),(0,0),(0,0)},您可以在 get_collinear 方法中让 c+=3 代替 c++
-
另外,您可以将算法减少到 O(N^2)。 stackoverflow.com/questions/4179581/…
-
在上面的链接中,单独找到 dx/dy 如何证明共线性?我们也不需要 y 截距吗?我不知道它是如何 O(n^2)。
-
如果将每一对点映射到
y intercept加上direction,那么同一行上的所有点对都落在同一个 bin 中。所以这是 O(n^2)。但请记住,如果您将方向计算为浮点数,则舍入差异可能是一个问题(您可以将dx和dy除以gcd以获得准确性)。 -
我会使用 dir=atanxy(dx,dy) (或 atan2(dx,dy) 如果你喜欢)而不是 dx/dy 它有点懒惰但更精确。删除重复点,仅测试目录(如果目录不匹配而不是它们不共线)并在过滤掉坏线/点后检查线是否没有移动。
标签: performance refactoring time-complexity computational-geometry