По заданным n точкам на двумерной плоскости найдите максимальное количество точек, лежащих на одной прямой
Ниже приведено решение, которое я пытаюсь реализовать.
/**
* 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 точки, я отправляю эти 2 точки в метод get_collinear, который попадает в линию, образованную этими 2 точками, со всеми элементами массива, чтобы проверить, коллинеарны ли 3 точки. Я знаю, что это метод грубой силы. Однако в случае, когда ввод [(0,0), (0,0)] мой результат не удается. В цикле else я должен добавить условие, чтобы выяснить такие случаи. Может кто-нибудь помочь мне с решением этого. И существует ли лучшее решение этой проблемы в лучшее время выполнения. Я не могу думать ни о чем.