题目见下:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
解析思路:
1)假设第一个点是否在直线上,算出其连线的最大值,存入vector中。
2)假设第一个点不在直线上,第二个点在直线上,求出最大值,存入vector中。
3)以此类推。
4)判断vector中的最大值。
5)完毕。
注意事项:
1)重复点。
2)只有一个点。
3)只有两个点。
4) 注意使用unique函数,他不仅会改变原vector的顺序,也会改变其值。
代码:
/**
* 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) {
int size = points.size();
if (size == 0)
{
return 0;
}
vector<int> maxans;
for (int i = 0;i<size-1;i++)
{
int len = maxnum(points);
maxans.push_back(len);
points.erase(points.begin(),points.begin()+1);
}
if (maxans.empty())
{
return 1;
}
vector<int>::iterator pos;
pos = max_element(maxans.begin(),maxans.end());
return *pos;
}
private:
int maxnum(vector<Point> points)
{
vector<Point>::iterator it;
struct Point b;
struct Point a = points[0];
vector<double> result;
int samecount = 0;
for (it = points.begin()+1;it<points.end();it++)
{
b = *it;
if (b.x==a.x&&b.y==a.y)
{
samecount++;
}
else if (b.x == a.x)
{
result.push_back(0XFFFFFF);
}
else
{
double quoa = (double)(b.y-a.y)/(b.x-a.x);
result.push_back(quoa);
}
}
int presize = result.size();
if(presize == 0)
{
return samecount+1;
}
sort(result.begin(),result.end());
vector<double>::iterator iter;
iter = result.begin();
double value = *iter;
vector<int> maxans;
int count = 1;
for (iter = iter+1;iter<result.end();iter++)
{
if (value == *iter)
{
count++;
}
else
{
value = *iter;
maxans.push_back(count);
count = 1;
}
}
maxans.push_back(count);
vector<int>::iterator pos;
pos = max_element(maxans.begin(),maxans.end());
return *pos+samecount+1;
}
};