对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
#include <iostream>
#include <vector>
#include <map>
using namespace std;
/**
* Definition for a point.
*/
struct Point {
int x;
int y;
Point() : x(0), y(0) {}
Point(int a, int b) : x(a), y(b) {}
};
//map的比较函数
struct cmp_key
{
bool operator()(const Point &k1, const Point &k2)const
{
if (k1.x != k2.x)
{
return k1.x < k2.x;
}
return false;
}
};
class Solution {
public:
int maxPoints(vector<Point> &points) {
int nMax = 0;
int nNum = 0;
int nIndex = 0;
float fratio = 0.0;
map<Point, int, cmp_key> tempMap;
for (int i = 0; i < points.size()-1; i++)
{
tempMap.clear();
for (int j = i + 1; j < points.size(); j ++)
{
nNum = 0;
fratio = (float)(points[i].y - points[j].y) / (float)(points[i].x - points[j].x);
nIndex = j;
if (tempMap.find(points[j]) != tempMap.end())
{
continue;
}
while (nIndex < points.size())
{
if (fratio*(points[nIndex].x - points[i].x) + points[i].y == points[nIndex].y)
{
tempMap[points[nIndex]] = 0;
nNum++;
}
nIndex++;
}
if (nMax < nNum)
{
nMax = nNum;
}
}
}
return nMax +1;
}
};
int main()
{
vector<Point> vec;
vec.push_back(Point(1, 1));
vec.push_back(Point(2, 3));
vec.push_back(Point(3, 5));
vec.push_back(Point(2, 2));
Solution s;
int a = s.maxPoints(vec);
return 0;
}