1   /*
 2      *  A line is determined by two factors,say y=ax+b
 3      *  
 4      *  If two points(x1,y1) (x2,y2) are on the same line(Of course). 
 5 
 6      *  Consider the gap between two points.
 7 
 8      *  We have (y2-y1)=a(x2-x1),a=(y2-y1)/(x2-x1) a is a rational, b is canceled since b is a constant
 9 
10      *  If a third point (x3,y3) are on the same line. So we must have y3=ax3+b
11 
12      *  Thus,(y3-y1)/(x3-x1)=(y2-y1)/(x2-x1)=a
13 
14      *  Since a is a rational, there exists y0 and x0, y0/x0=(y3-y1)/(x3-x1)=(y2-y1)/(x2-x1)=a
15 
16      *  So we can use y0&x0 to track a line;
17      */
18     
19     public class Solution{
20         public int maxPoints(Point[] points) {
21             if (points==null) return 0;
22             if (points.length<=2) return points.length;
23             
24             Map<Integer,Map<Integer,Integer>> map = new HashMap<Integer,Map<Integer,Integer>>();
25             int result=0;
26             for (int i=0;i<points.length;i++){ 
27                 map.clear();
28                 int overlap=0,max=0;
29                 for (int j=i+1;j<points.length;j++){
30                     int x=points[j].x-points[i].x;
31                     int y=points[j].y-points[i].y;
32                     if (x==0&&y==0){
33                         overlap++;
34                         continue;
35                     }
36                     int gcd=generateGCD(x,y);
37                     if (gcd!=0){
38                         x/=gcd;
39                         y/=gcd;
40                     }
41                     
42                     if (map.containsKey(x)){
43                         if (map.get(x).containsKey(y)){
44                             map.get(x).put(y, map.get(x).get(y)+1);
45                         }else{
46                             map.get(x).put(y, 1);
47                         }                       
48                     }else{
49                         Map<Integer,Integer> m = new HashMap<Integer,Integer>();
50                         m.put(y, 1);
51                         map.put(x, m);
52                     }
53                     max=Math.max(max, map.get(x).get(y));
54                 }
55                 result=Math.max(result, max+overlap+1);
56             }
57             return result;
58             
59             
60         }
61         private int generateGCD(int a,int b){
62     
63             if (b==0) return a;
64             else return generateGCD(b,a%b);
65             
66         }
67     }

参考:https://leetcode.com/problems/max-points-on-a-line/discuss/47113/A-java-solution-with-notes

posted on 2019-03-08 16:02  Sempron2800+  阅读(232)  评论(0编辑  收藏  举报