|  | @@ -0,0 +1,77 @@
 | 
	
		
			
				|  |  | +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);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |