这题的主要思路是建立一个二维的数组,然后遍历该二维数组,其实一个上三角或者下三角的矩阵也就足够了,然后注意把已经搜索过的解给标记,避免重复搜索,最有有一点要注意的是浮点数double的判断相等不能直接用等于,因为会有舍入误差,因此设计了一个判断相等的函数,只要两个浮点数相差小于一个很小的小数,就认为它们相等。
class Solution {
public:
int maxPoints(vector<Point> &points) {
int size = points.size();
if (points.size() < 2)
return points.size();
bool **a = new bool*[size];
for (int i = 0; i < size; i++)
{
a[i] = new bool[size];
for (int j = 0; j < size; j++)
{
a[i][j] = false;
}
}
int max = 2;
int count = 2;
for (int i = 0; i < size;i++)
for (int j = 0; j < size; j++)
{
if (i == j)continue;
if (!a[i][j])
{
a[i][j] = a[j][i] = true;
if (points[i].x == points[j].x)
vertical = true;
else vertical = false;
SetXY(points[i], points[j]);
//cout << "line:(" << points[i].x << ","<<points[i].y << ")(" << points[j].x << ","<<points[j].y << ")" << endl;
count = 2;
for (int k = 0; k < size; k++)
{
if (k != i&&k != j&&OnSameLine(points[k]))
{
//cout<<
a[i][k] = a[j][k] = a[k][i] = a[k][j] = true;
count++;
}
}
if (count>max)
max = count;
}
}
for (int i = 0; i < size;i++)
{
delete []a[i];
}
delete []a;
return max;
}
private:
Point x;
Point y;
double a;
bool vertical;
void SetXY(Point& x, Point&y)
{
this->x = x;
this->y = y;
if (!vertical)
a = (double)(this->x.y - this->y.y) / (double)(this->x.x - this->y.x);
}
bool OnSameLine(Point& z)
{
if (!vertical)
{
double temp = (z.y - y.y) - a * (z.x - y.x);
if (temp < 0)
temp = -temp;
return temp < 0.000001;
}
else return z.x == y.x;
}
};