LeetCode每日一题:在同一直线上点的最大个数

问题描述

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

问题分析

本题求给定2D平面上的最多有几个点在同一直线上。
这道题没有好的算法,一般用穷举法即可。

  1. 穷举所有的点a
  2. 计算其余点和a的斜率,存储在HashMap中
  3. 计算和a点有多少个重合点dup
  4. 计算和a具有相同x坐标的点数vtl(垂直于x轴斜率不存在)
  5. 取(2)中最大值+dup,与(3)中vtl比较,取较大值
  6. 穷举所有点,分别计算(2)-(5),得到最大值返回即可

代码实现

public int maxPoints(Point[] points) {
        int result = 0;
        int n = points.length;
        if (n < 2) return n;
        for (int i = 0; i < n; i++) {
            int dup = 1;//与点a重合的点,即x,y均相等的点,起始值为1
            int vtl = 0;//与点a在同一x上的点,即x相同而y不同的点
            HashMap 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);//计算斜率,记得要格式转化成float
                    if (map.containsKey(k)) {
                        map.put(k, map.get(k) + 1);
                    } else {
                        map.put(k, 1);
                    }//保存斜率相同的点
                }
            }
            int max = vtl;//斜率相同但是若y不同会是两条直线
            for (float k : map.keySet()) {
                max = Math.max(max, map.get(k));//找寻斜率相同的最多点
            }
            result = Math.max(result, max + dup);//斜率相同的点+重合最多的点
        }
        return result;
    }

你可能感兴趣的:(LeetCode每日一题:在同一直线上点的最大个数)