Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
1.要注意斜率不存在的情况
2.要注意点重复的时候的情况
3.要注意int跟float的区别,最后的斜率是float类型的,但点坐标是int类型的,在计算斜率的时候要注意精度的问题。
4.注意-0 跟 0 的区别。 -0!=0
/**
* 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 class Solution {
public static int maxPoints(Point[] points) {
// public static int maxPoints(Point[] points) {
int max = 0;
float zero = 0;
int thismax = 0;
int len = points.length;
if(len == 1) return 1;
float inf = 10000;
for(int i = 0; i < len;i++)
{
HashMap<Float,Integer> record = new HashMap<Float,Integer>();
int same = 0;
for(int j = i+1;j<len;j++)
{
if(points[i].x == points[j].x && points[i].y == points[j].y)
{
same++;
}
else if(points[i].x - points[j].x == 0)
{
if(!(record.containsKey(inf)))
{
record.put(inf,2);
}
else
{
int time = record.get(inf);
time++;
record.put(inf,time);
}
}
else
{
float tmp = (float)(points[i].y - points[j].y)/(float)(points[i].x - points[j].x);
if(tmp == -0) tmp = 0;
if(!(record.containsKey(tmp)))
{
record.put(tmp,2);
//System.out.println("here");
}
else
{
int count = record.get(tmp);
count++;
record.put(tmp,count);
}
}
thismax = 0;
for (float key : record.keySet())
{
if(thismax < record.get(key))
thismax = record.get(key);
}
if(thismax == 0) thismax = same + 1;
else thismax = thismax + same;
}
if(max < thismax) max = thismax;
}
return max;
}
}