问题描述:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
java方案:
需要两重循环,第一重循环遍历起始点a,第二重循环遍历剩余点b。
a和b如果不重合,就可以确定一条直线。
对于每个点a,构建 斜率->点数 的map。
(1)b与a重合,以a起始的所有直线点数+1 (用duplicate统一相加)
(2)b与a不重合,a与b确定的直线点数+1
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
import java.util.*;
public class Solution {
public int maxPoints(Point[] points) {
int result=0;
if(points.length==0){
return 0;
}
if(points.length==1){
return 1;
}
for(int i=0;i<points.length;i++){
int curmax=1;int duplicate=0;
int veticalpoint=0;
Map<Double,Integer> mp=new HashMap<Double,Integer>();
Point a=points[i];
for(int j=0;j<points.length;j++){
if(j==i)continue;
Point b=points[j];
double x1=b.x-a.x;
double y1=b.y-a.y;
if(x1==0&&y1==0){//点重合了
duplicate++;
}else if(x1==0){//垂直线段上的点,两者顺序不能反,必须先判断重合在判断垂直
if(veticalpoint==0)veticalpoint=2;
else veticalpoint++;
curmax=max(curmax,veticalpoint);
}
else {
Double k=y1/x1;
if(mp.get(k)==null)mp.put(k, 2);
else{mp.put(k, mp.get(k)+1);}
curmax=max(curmax,mp.get(k));
}
}
result=max(result,curmax+duplicate);
}
return result;
}
public int max(int a,int b){
return a>b?a:b;
}
}