Max Points on a Line Total Accepted: 16037 Total Submissions: 148156 My Submissions
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
注意考虑没有斜率的情况需要特殊考虑,还要考虑有重复点的情况
public class MaxPointsOnALine {
static class Point {
int x;
int y;
Point(){
x = 0;
y = 0;
}
Point(int a, int b){
x = a;
y = b;
}
}
public int maxPoints(Point[] points) {
if (points == null || points.length < 1) {
return 0;
}
int n = points.length;
if (n == 1) {
return 1;
}
int maxLine = 0;
for (int i = 0; i < n; i++) {
int samePoint = 0;
int noK = 0;
int zeroK = 0;
Point curPoint = points[i];
Map<Double, Integer> kMap = new HashMap<Double, Integer>();
for (int j = 0; j < n; j++) {
Point point = points[j];
if (curPoint.x == point.x && curPoint.y == point.y) {
samePoint++;
} else if (curPoint.x == point.x) {
noK++;
} else if (curPoint.y == point.y) {
zeroK++;
} else {
double k = ((double) curPoint.y - (double) point.y) / (curPoint.x - point.x);
if (kMap.containsKey(k)) {
kMap.put(k, kMap.get(k) + 1);
} else {
kMap.put(k, 1);
}
}
}
if (maxLine < (noK + samePoint)) {
maxLine = noK + samePoint;
}
if (maxLine < (zeroK + samePoint)) {
maxLine = zeroK + samePoint;
}
for (Integer value : kMap.values()) {
if (value + samePoint > maxLine) {
maxLine = value + samePoint;
}
}
}
return maxLine;
}
}