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


题意:给一个二维平面,上面有好多点,有横纵坐标,找出一条直线,使得这条线上的点数量最多。

这是当时百度春招实习时面试官问过的一道题,当时虽然没有写代码。但是之后回来也没有再看过。今天刷题,突然发现是LeetCode原题,hard难度。不仅感慨,长叹一声。然后今天舍友视频面试小红书的时候也被问到了这道题。所以就做一下记录吧。


思路的话就是:一般就是求斜率,遍历所有的点,但是有几个地方需要注意一些,因为这些点可能有重合的!!!还有就是求斜率的时候注意垂直X轴的那些点,斜率是无穷,单独计算。

public class Solution {
    public int maxPoints(Point[] points) {
        if(points.length <= 0) return 0;
        if(points.length <= 2) return points.length;
        int result = 0;
        for(int i = 0; i < points.length; i++){
        //针对每个点,用hash表存储和其他点所能组成的各种斜率情况,求一个最大
            HashMap<Double, Integer> hm = new HashMap<Double, Integer>();
            int samex = 1;//默认自己 
            int samep = 0;
            ///以每个点作为起点,求与其他点的斜率的最大值
            for(int j = 0; j < points.length; j++){
                if(j != i){
                    if((points[j].x == points[i].x) && (points[j].y == points[i].y)){
                        samep++;
                    }
                    ///垂直X轴的点们
                    if(points[j].x == points[i].x){
                        samex++;
                        continue;
                    }
                    //开始计算斜率
                    //double k = (double)(points[j].y - points[i].y) / (double)(points[j].x - points[i].x);
                    double k = (double)(points[j].x - points[i].x) / (double)(points[j].y - points[i].y);
                    ///存在的话直接加1
                    if(hm.containsKey(k)){
                        hm.put(k,hm.get(k) + 1);
                    }else{
                        hm.put(k, 2);////包含当前点,和遍历到的点
                    }
                    //每次都求一个最大值,求每个不同斜率的最大值
                    result = Math.max(result, hm.get(k) + samep);
                }
            }
            ///每次需要比较一下在一条直线,垂直X轴上的点。。。
            result = Math.max(result, samex);
        }
        return result;
    }
}