Leetcode 149. 直线上最多的点数

给定一个二维平面,平面上有 个点,求最多有多少个点在同一条直线上。

分析:

暴力破解

根据两点确定一条直线原理,我们可以选取两个点确定一条直线,再看看其他的点有多少位于这条直线上

第一,斜率的计算,如果用除法计算斜率,会有斜率为无穷大的问题,另外除法的结果是浮点数,可能会有不精确的问题,所以我们使用乘法来进行斜率的比较,当然乘法也要注意,int的乘法结果可能会超出上限,要用long来保存乘法结果

第二,重复点的问题,如果一开始选取用来确定一条直线的两个点是重复点就会造成问题,应该跳过这种情况

代码:
/**

* Definition for a point.

* class Point {

*    int x;

*    int y;

*    Point() { x = 0; y = 0; }

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

* }

*/

public class Solution {

    public int maxPoints(Point[] points) {

        // 如果总坐标点少于 3 个,直接返回答案

        int n = points.length;

        if (points.length <= 2) return n;

        // 搜索直线上最多的点数

        int max = 0;

        for (int i = 0; i < n; i ++) {

            // same 表示有多少个和 i 一样的点

            int same = 1;

            for (int j = i + 1; j < n; j ++) {

                // cnt 表示除了 i 坐标点外,有多少个点在 i、j 坐标点构成的直线上

                int cnt = 0;

                if (points[i].x == points[j].x && points[i].y == points[j].y) {

                    // i、j 是重复点,计数

                    same ++;

                } else {

                    // i、j 不是重复点,检查其他点是否在这条直线上,j 坐标点也在这条直线上,所以 cnt ++

                    cnt ++;

                    long xDiff = (long)(points[i].x - points[j].x);

                    long yDiff = (long)(points[i].y - points[j].y);

                    for (int k = j + 1; k < n; k ++) {

                        if (xDiff * (points[i].y - points[k].y) == yDiff * (points[i].x - points[k].x)) {

                            cnt ++;

                        }

                    }

                }

                // 最大值比较

                max = Math.max(max, cnt + same);

            }

        }

        return max;

    }

}

你可能感兴趣的:(Leetcode 149. 直线上最多的点数)