1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import java.util.HashMap;
- /**
- * Definition for a point.
- * class Point {
- * int x;
- * int y;
- * Point() { x = 0; y = 0; }
- * Point(int a, int b) { x = a; y = b; }
- * }
- */
- class Solution {
- class Pair {
- final int _1;
- final int _2;
- Pair(int _1, int _2) {
- this._1 = _1;
- this._2 = _2;
- }
- @Override
- public int hashCode() {
- int hash = 7;
- hash = 71 * hash + _1;
- hash = 71 * hash + _2;
- return hash;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (!(obj instanceof Pair)) return false;
- Pair p = (Pair) obj;
- return p._1 == _1 && p._2 == _2;
- }
- }
- public int maxPoints(Point[] points) {
- int res = 0;
- for (int i = 0; i < points.length; i++) {
- HashMap<Pair, Integer> map = new HashMap<>();
- int cnt = 1;
- for (int j = 0; j < points.length; j++) {
- if (j == i) continue;
- Point p1 = points[i];
- Point p2 = points[j];
- if (p1.x == p2.x && p1.y == p2.y) {
- cnt++;
- continue;
- }
- Pair slope = getSlope(p1, p2);
- Integer freq = map.getOrDefault(slope, 0);
- map.put(slope, freq + 1);
- }
- int max = 0;
- for (Integer val : map.values()) {
- max = Math.max(max, val);
- }
- res = Math.max(res, max + cnt);
- }
- return res;
- }
- private Pair getSlope(Point p1, Point p2) {
- int dx = p1.x - p2.x;
- int dy = p1.y - p2.y;
- if (dx == 0) return new Pair(p1.x, 0);
- if (dy == 0) return new Pair(0, p1.y);
- int d = gcd(dx, dy);
- return new Pair(dx / d, dy / d);
- }
- private int gcd(int m, int n) {
- return n == 0 ? m : gcd(n, m % n);
- }
- }
|