LeetCode——max-points-on-a-line

Q:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
A:
这个题……很多坑……写了好几次才写对。
最重要的一点,在计算斜率时,不能使用除法,会有误差。可以使用最大公约数

    public static int maxPoints(Point[] points) {
        //点数个数判断
        if (points.length <= 1)
            return points.length;
        List<Integer> list = new ArrayList<>();
        int count;
        int max = 0;
        int size = points.length;
        //我这里做了防止同一条线重新计算
        boolean[][] flag = new boolean[size][size];
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++)
                flag[i][j] = i != j;
        }
        for (int i = 0; i < size - 1; i++) {
            for (int j = i + 1; j < size; j++) {
                if (!flag[i][j])
                    continue;
                //水平,垂直,同点三种方法判断
                if (points[i].x == points[j].x) {
                    for (int k = 0; k < size; k++) {
                        if (points[k].x == points[i].x)
                            list.add(k);
                    }
                } else if (points[i].y == points[j].y) {
                    for (int k = 0; k < size; k++) {
                        if (points[k].y == points[i].y)
                            list.add(k);
                    }
                //有斜率的线
                } else {
                    int x0 = points[i].x - points[j].x;
                    int y0 = points[i].y - points[j].y;
                    int a = gcd(x0, y0);
                    x0 = x0 / a;
                    y0 = y0 / a;
                    for (int k = 0; k < size; k++) {
                        int x = points[i].x - points[k].x;
                        int y = points[i].y - points[k].y;
                        if ((x == 0 && y == 0)) {
                            list.add(k);
                        } else {
                            int b = gcd(x, y);
                            x = x / b;
                            y = y / b;
                            if (x == x0 && y == y0)
                                list.add(k);
                        }
                    }
                }
                count = list.size();
                if (count > max)
                    max = count;
                for (int m = 0; m < list.size() - 1; m++) {
                    for (int n = m + 1; n < list.size(); n++) {
                        flag[m][n] = false;
                        flag[n][m] = false;
                    }
                }
                list.clear();
            }
        }
        return max;
    }

    //最大公约数计算,一定一定要判断b是否为0
    public static int gcd(int a, int b) {
        return (b == 0) ? a : gcd(b, a % b);
    }

猜你喜欢

转载自www.cnblogs.com/xym4869/p/12430239.html