您的位置:首页 > 其它

Leetcode Max Points on a Line

2017-07-14 15:20 344 查看
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

暴力破解,通过记录hash方法来进行记录中间结果,代码如下:

/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector<Point>& points) {
if(points.size()<2)
return points.size();

int result=0;
for(int i=0;i<points.size()-1;i++)
{
int vect=1,duplicate=0,local=1;
unordered_map<double,int> map;
for(int j=i+1;j<points.size();j++)
{
if(points[i].x == points[j].x)
{
if(points[i].y == points[j].y)
duplicate++;
else
vect++;
}
else
{
double slop = (points[j].y-points[i].y)*1.0/(points[j].x-points[i].x);
map[slop]==0?map[slop]=2:map[slop]++;
local = max(local,map[slop]);
}
}
local = max(local+duplicate,vect+duplicate);
result = max(local,result);
}
return result;
}
};

结果发现无法通过,应该是求slop的时候无法处理,导致虽然不在同一直线上也被算进去,需要找其他的方法。通过学习其他人的代码,发现如果点在同一条直线上y=ax+b,那么a=(y2-y1)/(x2-x1).,记录a的话会出错,那么我们可以记录(y2-y1)以及(x2-x1)这个数字对,将他们去除公约数后的值w,一条线上的两个点之间求出的w必然相等。
代码如下:

/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector<Point>& points) {
if(points.size()<2)
return points.size();

int result=0;
for(int i=0;i<points.size()-1;i++)
{
int vect=0,duplicate=1,local=0;
map<pair<int,int>,int> map;
for(int j=i+1;j<points.size();j++)
{
if(points[i].x == points[j].x)
{
if(points[i].y == points[j].y)
duplicate++;
else
vect++;
}
else
{
int a = (points[j].y-points[i].y);
int b = (points[j].x-points[i].x);
int gcd = GCD(a,b);

a /=gcd;b/=gcd;
map[make_pair(a,b)]++;
local = max(local,map[make_pair(a,b)]);
}
}
local = max(local+duplicate,vect+duplicate);
result = max(local,result);
}
return result;
}

int GCD(int a, int b) {

if(b==0) return a;
else return GCD(b, a%b);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode