Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

import java.util.HashMap;
import java.util.Map;

class Point
{
    int x;
    int y;
    Point() { x = 0; y = 0; }
    Point(int a, int b) { x = a; y = b; }
}

/**
 *
 *   需要两重循环,第一重循环遍历起始点a,第二重循环遍历剩余点b。
 *
 *     a和b如果不重合,就可以确定一条直线。
 *
 *     对于每个点a,构建 斜率->点数 的map。
 *
 *     (1)b与a重合,以a起始的所有直线点数+1 (用dup统一相加)
 *
 *     (2)b与a不重合,a与b确定的直线点数+1
 */
public class Solution61
{
    public int maxPoints(Point[] points)
    {
        int n = points.length;
        if(n<2)
            return n;

        int ret = 0;
        for(int i=0;i<n;i++)
        {
            //分别统计与点i重合以及垂直的点的个数
            int dup = 1, vtl = 0;
            Map<Float,Integer> map = new HashMap<>();
            Point a = points[i];

            for(int j=0;j<n;j++)
            {
                if(i == j)
                    continue;
                Point b = points[j];
                if(a.x == b.x)
                {
                    if(a.y == b.y)
                        dup ++;
                    else
                        vtl++;
                }
                else
                {
                    float k = (float) (a.y - b.y)/(a.x - b.x);
                    if(map.get(k) == null)
                        map.put(k,1);
                    else
                        map.put(k,map.get(k)+1);
                }
            }

            int max = vtl;
            for(float k: map.keySet())
            {
                max = Math.max(max,map.get(k));
            }

            ret = Math.max(ret,max + dup);
        }

        return ret;
    }
}