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 中的所有点 互不相同
条件分析
- 如何判断三个点在一个直线上,斜率相等则代表在一个直线上;
解题思路(查找表)
-
从某一个点出发,计算该点到其他点的斜率,遍历这些斜率,如果存在斜率相等的点,则说明这些点再一条直线上,对应的count++;
-
记录从该点出发到不同点的斜率对应的数量之后,遍历该斜率与数量的对照表,找到最大值;
-
依次遍历其他点,将得到的最大值与保存的最大值进行比较,如果大于最大值,则更新最大值,遍历完成后可以得到最终的最大值;
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;
}
浙公网安备 33010602011771号