zoukankan      html  css  js  c++  java
  • LeetCode——直线上最多的点数

    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);
        }
    
  • 相关阅读:
    Mysql命令非交互式执行SQL命令
    centos7离线安装rpm包自动解决依赖
    webpack
    【转】GUID学习
    Docker安装mysql
    C++的vector的使用方法
    php自动加载
    Spring MVC 入门笔记
    Java泛型
    Java输入输出
  • 原文地址:https://www.cnblogs.com/xym4869/p/12430239.html
Copyright © 2011-2022 走看看