149. 直线上最多的点数(LeetCode)

题目描述


给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

示例 1:

输入:points = [[1,1],[2,2],[3,3]]

输出:3

示例 2:

输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]

输出:4

提示:

1 <= points.length <= 300

points[i].length == 2

-104 <= xi, yi <= 104

points 中的所有点 互不相同

条件分析


  1. 如何判断三个点在一个直线上,斜率相等则代表在一个直线上;

解题思路(查找表)


  1. 从某一个点出发,计算该点到其他点的斜率,遍历这些斜率,如果存在斜率相等的点,则说明这些点再一条直线上,对应的count++;

  2. 记录从该点出发到不同点的斜率对应的数量之后,遍历该斜率与数量的对照表,找到最大值;

  3. 依次遍历其他点,将得到的最大值与保存的最大值进行比较,如果大于最大值,则更新最大值,遍历完成后可以得到最终的最大值;

4.考虑到斜率可能不能够被整除,使用数字可能不太精确,因此要如何存储斜率呢?(暂未考虑)

编码如下

public int maxPoints(int[][] points) {
    if (points.length == 1) {
        return 1;
    }
    int max = 0;
    for (int i=0; i<points.length; i++) {
        Map<Double,Integer> map = new HashMap<>();
        for (int j=0; j<points.length; j++) {
            if (i != j) {
                double dis = (points[i][0]-points[j][0]+0d) / (points[i][1]-points[j][1]+0d);
                Integer count = map.get(dis);
                if (count == null) {
                    count = 1;
                }
                count++;
                map.put(dis, count);
            }
        }
        for (int count: map.values()) {
            if (count > max) {
                max = count;
            }
        }
    }
    return max;
}
posted @ 2021-07-28 20:37  咸与维新  阅读(214)  评论(0)    收藏  举报