Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

 

对每个点,考察其他点与它组成的直线斜率,使用HashMap将斜率与点个数对应起来。

需要注意的一点是特殊斜率,比如两点重复,两点横坐标相同。所以用String表示斜率比较好

获取斜率函数:

 1 public String getSlope(Point p1, Point p2)
 2     {
 3         if(p1.x==p2.x && p1.y==p2.y)
 4             return "any";
 5         else if(p1.x==p2.x)
 6             return "inf";
 7         else if(p1.y==p2.y)
 8             return "0";
 9         else
10         {
11             double temp = p2.y-p1.y;
12             temp = temp/(p2.x-p1.x);
13             return temp+"";
14         }
15     }

(由于double类型的0可能会表示成"-0.0"所以需要把纵坐标为0的情况单独列出)

每次获得两点斜率,有三种情况:1: 两点重复,增加overlap值,一重循环找出临时最多点个数tempmax后加上。2:新有效斜率: 直接放入HashMap中并把其对应点个数值置为2,以及刷新最多点个数tempmax. 3:已有斜率:更新对应斜率的点个数值(+1), 刷新tempmax.

tempmax基础点个数为1,一重循环结束后加上重复点个数overlap,与总max值比较。

以下为代码:

 1 public int maxPoints(Point[] points) {
 2         if(points.length==0)
 3             return 0;
 4         if(points.length==1)
 5             return 1;
 6         if(points.length==2)
 7             return 2;
 8         
 9         int max = 2;
10         for(int i=0;i<points.length;i++)
11         {
12             HashMap<String, Integer> hs = new HashMap<String, Integer>();
13             int overlap = 0;
14             int tempmax = 1;
15             for(int j=i+1;j<points.length;j++)
16             {
17                 String slp = getSlope(points[i],points[j]);
18                 if(slp.equals("any"))
19                     overlap++;
20                 else if(!hs.containsKey(slp))
21                 {
22                     hs.put(slp, 2);
23                     tempmax = Math.max(tempmax,2);
24                 }
25                 else
26                 {
27                     int number = hs.get(slp) + 1;
28                     hs.put(slp, number);
29                     tempmax = Math.max(tempmax, number);
30                 }
31             }
32             max = Math.max(max, tempmax+overlap);
33         }
34         return max;
35     }

吐槽:double保存斜率其实不准确,最准确还是应该使用商和余数一对数字保存。

posted on 2014-09-10 11:35  metalx  阅读(366)  评论(0编辑  收藏  举报