Given _n _points on a 2D plane, find the maximum number of points that lie on the same straight line.
Example
Example 1:
Input:
[[1,1],[2,2],[3,3]]
Output:
3
Explanation:
^
|
| o
| o
| o
+------------->
0 1 2 3 4
Example 2:
Input:
[[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
Output:
4
Explanation:
^
|
| o
| o o
| o
| o o
+------------------->
0 1 2 3 4 5 6
Note
O(n^2)的方法,注意overlap
GCD算一点到其他点的斜率,i = 0: len, j = i + 1 : len
Map的key就是GCD之后的斜率,维护最大的频次,每次run外层循环进行clear和更新
Code
/** * Definition for a point. * class Point { * int x; * int y; * Point() { x = 0; y = 0; } * Point(int a, int b) { x = a; y = b; } * } */classSolution {publicintmaxPoints(Point[] points) {if (points ==null||points.length==0) return0;int res =0, len =points.length;Map<String,Integer> map =newHashMap<>();for (int i =0; i < len; i++) {int overlap =0, max =0;map.clear();for (int j = i +1; j < len; j++) {int x = points[j].x- points[i].x;int y = points[j].y- points[i].y;if (x ==0&& y ==0) { overlap++;continue; }int gcd =findGCD(x, y);if (gcd !=0) { x /= gcd; y /= gcd; }String key = x +"@"+ y;map.put(key,map.getOrDefault(key,0) +1); max =Math.max(max,map.get(key)); } res =Math.max(res, max + overlap +1); }return res; }privateintfindGCD(int a,int b) {if (b ==0) {return a; }returnfindGCD(b, a % b); }}