Max Points on a Line

来源:互联网 发布:linux 关闭mysql服务 编辑:程序博客网 时间:2024/06/05 17:07

https://leetcode.com/problems/max-points-on-a-line/

计算三个点是不是在一个连线上,三个点需要满足(y2-y1)/(x2-x1)=(y3-y2)/(x3-x2)如果x2=x3=x1则表示三点在同一条垂直连线上。如果x1=x2=x3&&y1=y2=y2那么表示三个点是同一个点。
因此在计算的时候需要考虑两点的x坐标是否相等。
本题的思路是,从每一个点p出发计算他和其他点q的斜率,如果斜率相等则表示这几点在同一个连线上,更新从该点p出发的同一条直线上最大的点的数量。更新的时候需要考虑相同的点。
时间复杂度是O(n2)

/** * 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()==0) return 0;        int maxPoints=0;        for(int i=0;i<points.size();i++){            int iMax=0,iVer=0,iSame=0;            unordered_map<float,int> gradients;            for(int j=i+1;j<points.size();j++){                if(points[j].x==points[i].x){                    if(points[j].y==points[i].y) iSame++;                    else iVer++;                    continue;                }                float gradient=(float)(points[j].y-points[i].y)/(float)(points[j].x-points[i].x);                if(gradients.find(gradient)==gradients.end()) gradients.insert(pair<float,int>(gradient,1));                else gradients[gradient]++;                iMax=max(iMax,gradients[gradient]);            }            iMax=max(iMax,iVer)+iSame+1;            maxPoints=max(iMax,maxPoints);        }        return maxPoints;    }};


0 0
原创粉丝点击