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  咸与维新  阅读(230)  评论(0)    收藏  举报