[LeetCode]Max Points on a Line

来源:互联网 发布:淘宝打折活动名称 编辑:程序博客网 时间:2024/06/08 10:31

 这题的主要思路是建立一个二维的数组,然后遍历该二维数组,其实一个上三角或者下三角的矩阵也就足够了,然后注意把已经搜索过的解给标记,避免重复搜索,最有有一点要注意的是浮点数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;}};


0 0