题目:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
思路:
1.每个点与其他点进行比较
2.用Map来保存斜率,两个点之间有三种关系
(1)重复,用dup来保存重复数量
(2)垂直,用vcnt来保存垂直数量
(3)倾斜,用map来保存同一斜率的数量
3.计算垂直和倾斜中点数最大值,加上dup返回
代码:
/**
* 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 result = 0;
for(int i=0; i<n; i++)
{
int dup = 1;//重复点
int vcnt = 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
{
vcnt++;
}
}
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 = vcnt;
for(float k: map.keySet())
{
max = Math.max(max, map.get(k));
}
result = Math.max(result, max+dup);
}
return result;
}
}