copyright:Leetcode
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* public boolean equals(Point P){
* if(x = P.x && y == P.y)
* return true;
* else
* return false;
* }
* }
*/
public class Solution {
public int maxPoints(Point[] points) {
switch(points.length){
case 0: return 0;
case 1: return 1;
case 2: return 2;
default:break;
}
//check if the line we wanted is started with i
int max = 0;
for(int i=0;i < points.length - 1;i++){
ArrayList<Double> AList = new ArrayList<Double>();
for(int j=i+1;j < points.length;j++){
if(points[i].x != points[j].x){
if(points[i].y == points[j].y)
AList.add(0.0);
else
AList.add((points[j].y - points[i].y) / (double)(points[j].x - points[i].x));
}
//Double.NEGATIVE_INFINITY marks the same point as start point
else if(points[i].x == points[j].x && points[i].y == points[j].y){
AList.add(Double.NEGATIVE_INFINITY);
}
else{
AList.add(Double.POSITIVE_INFINITY);
}
}
int val = maxfrequency(AList);
if(val > max)
max = val;
}
return max;
}
private int maxfrequency(ArrayList<Double> AList){
if(AList.size() == 1)
return 2;
Collections.sort(AList);
int max = 0, counter = 0, sum = 1;
double val = AList.get(0);
for(int i=0;i < AList.size();i++){
if(AList.get(i) == Double.NEGATIVE_INFINITY){
sum++;
}else if(AList.get(i).equals(val)){
counter++;
}else{
if(counter > max)
max = counter;
counter = 1;
val = AList.get(i);
}
}
if(counter > max)
max = counter;
return max + sum;
}
}
Runtime: 516 ms