题目描述
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
解决思路:
因为任意两个点就能形成一条线
两个点的情况有三种:
- 重合
- 一条垂直x轴的线
- 普通直线
1.固定两点中的一个点,然后另一个点为任意的点,同时建立一个哈希表保存固定点形成线的斜率以及对应的次数
形式为HashMap<Float, Integer> 其中key为斜率, val为这个斜率出现的次数,以及记录重合点个数以及垂直个数
2. 如果两个点重合 重合点个数+1, 如果两个点形成的连线垂直x轴,垂直点+1, 如果是普通连线,则判断哈希表中时候有存在一样的斜率, 有 + 1, 没有put一个
3 初始max = 垂直点个数, 然后取max = 垂直点个数 与 哈希表中斜率出现最多的直线的最大值,最后加上重复点个数
4 对于每个点都做上述的三个步骤,ret= Max(每个点的max ) ret表示整个图中在同一条线上的点的最大值
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
import java.util.*;
public class Solution {
public int maxPoints(Point[] points) {
int n = points.length;
if(n < 2) return n;
int ret = 0;
for(int i = 0; i < n; i++) {
// 分别统计与点i重合以及垂直的点的个数
int dup = 1, vtl = 0;
Map<Float, Integer> 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);
if(map.get(k) == null) map.put(k, 1);
else map.put(k, map.get(k) + 1);
}
}
int max = vtl;
for(float k: map.keySet()) {
max = Math.max(max, map.get(k));
}
ret = Math.max(ret, max + dup);
}
return ret;
}
}