给定2D平面上的n个点,求出同一直线上的最大点数。
分析
可以通过对每个点具有相同斜率的点进行计数来解决此问题。计数时,我们需要注意重复的点和垂直线上的点。
Java解决方案
public int maxPoints(Point[] points) {
if(points == null || points.length == 0) return 0;
HashMap<Double, Integer> result = new HashMap<Double, Integer>();
int max=0;
for(int i=0; i<points.length; i++){
int duplicate = 1;//
int vertical = 0;
for(int j=i+1; j<points.length; j++){
//手柄重复和垂直
if(points[i].x == points[j].x){
if(points[i].y == points[j].y){
duplicate++;
}else{
vertical++;
}
}else{
double slope = points[j].y == points[i].y ? 0.0
: (1.0 * (points[j].y - points[i].y))
/ (points[j].x - points[i].x);
if(result.get(slope) != null){
result.put(slope, result.get(slope) + 1);
}else{
result.put(slope, 1);
}
}
}
for(Integer count: result.values()){
if(count+duplicate > max){
max = count+duplicate;
}
}
max = Math.max(vertical + duplicate, max);
result.clear();
}
return max;
}
正常案例,垂直案例和重复案例之间的关系可以显示如下: