Max Points on a Line:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
给定n个点,求在同一条直线上的最多的点的个数。
基本思路就是:以每个“点”为中心,然后遍历剩余点,求出以i为起点j为终点的斜率(j>i),斜率相同的点一定共线。对每个i,初始化一个哈希表,key 为斜率,value 为该直线上的点数。遍历结束后得到和当前i点共线的点的最大值,再和全局最大值比较,最后就是结果。要考虑有重复点,和斜率不存在(即直线与x轴垂直)的情况。
时间复杂度O(n2),空间复杂度O(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) {
if (points == null || points.length == 0) {
return 0;
}
HashMap<Double, Integer> map=new HashMap<Double, Integer>();
int max = 1;
for(int i = 0 ; i < points.length; i++) {
// shared point changed, map should be cleared and server the new point
map.clear();
// maybe all points contained in the list are same points,and same points' k is
// represented by Integer.MIN_VALUE
map.put((double)Integer.MIN_VALUE, 1);
int dup = 0;
for(int j = i + 1; j < points.length; j++) {
if (points[j].x == points[i].x && points[j].y == points[i].y) {
dup++;
continue;
}
// look 0.0+(double)(points[j].y-points[i].y)/(double)(points[j].x-points[i].x)
// because (double)0/-1 is -0.0, so we should use 0.0+-0.0=0.0 to solve 0.0 !=-0.0
// problem
// if the line through two points are parallel to y coordinator, then K(slop) is
// Integer.MAX_VALUE
double key=points[j].x - points[i].x == 0 ?
Integer.MAX_VALUE :
0.0 + (double)(points[j].y - points[i].y) / (double)(points[j].x - points[i].x);
if (map.containsKey(key)) {
map.put(key, map.get(key) + 1);
} else {
map.put(key, 2);
}
}
for (int temp: map.values()) {
// duplicate may exist
if (temp + dup > max) {
max = temp + dup;
}
}
}
return max;
}
}