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);
}
};
暴力破解,通过记录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刷题笔记(穷举):max-points-on-a-line
- [LeetCode]Max Points on a Line
- LeetCode----Max Points On a Line
- [Leetcode] Max Points on a Line (Java)
- leetcode之Max Points on a Line
- LeetCode 3 Max Points on a Line
- leetcode -- Max Points on a Line -- 重点
- leetcode - Max Points on a Line
- LeetCode-149.Max Points on a Line
- **Leetcode 149. Max Points on a Line
- Leetcode习题:Max Points On a Line
- LeetCode--max-points-on-a-line
- [leetcode代码]Max Points on a Line
- LeetCode—Max Points on a Line解题报告
- LeetCode:Max Points on a Line
- leetcode Max Points on a Line(*)
- [LeetCode]149 Max Points on a Line
- leetcode-149. Max Points on a Line
- Max Points on a Line - LeetCode
- leetcode第一刷_Max Points on a Line