/**
* Given an array of points where points[i] = [xi, yi] represents a point on the X-
* Y plane, return the maximum number of points that lie on the same straight line.
* <p>
* <p>
* <p>
* Example 1:
* <p>
* <p>
* Input: points = [[1,1],[2,2],[3,3]]
* Output: 3
* <p>
* <p>
* Example 2:
* <p>
* <p>
* Input: points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
* Output: 4
* <p>
* <p>
* <p>
* Constraints:
* <p>
* <p>
* 1 <= points.length <= 300
* points[i].length == 2
* -10⁴ <= xi, yi <= 10⁴
* All the points are unique.
* <p>
* Related Topics几何 | 数组 | 哈希表 | 数学
* <p>
* 👍 454, 👎 0
*/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int maxPoints(int[][] points) {
int n = points.length;
if (n <= 2) {
return n;
}
int ret = 0;
for (int i = 0; i < n; i++) {
if (ret >= n - i || ret > n / 2) {
break;
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int j = i + 1; j < n; j++) {
int x = points[i][0] - points[j][0];
int y = points[i][1] - points[j][1];
if (x == 0) {
y = 1;
} else if (y == 0) {
x = 1;
} else {
if (y < 0) {
x = -x;
y = -y;
}
int gcdXY = gcd(Math.abs(x), Math.abs(y));
x /= gcdXY;
y /= gcdXY;
}
int key = y + x * 20001;
map.put(key, map.getOrDefault(key, 0) + 1);
}
int maxn = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
int num = entry.getValue();
maxn = Math.max(maxn, num + 1);
}
ret = Math.max(ret, maxn);
}
return ret;
}
public int gcd(int a, int b) {
return b != 0 ? gcd(b, a % b) : a;
}
}
//leetcode submit region end(Prohibit modification and deletion)