Max Points on a Line

来源:互联网 发布:单片机地址总线 编辑:程序博客网 时间:2024/05/01 15:42

基本思路就是两点确定一条直线,所以找出points的两两组合,然后再判断剩余的点是否在当前两两组合所产生的直线上,最后就可以得出当前直线上所有的点的个数。


思路很简单,但关键要注意一个陷阱:给出的点集合中可能有重复的点,所以一定要去重,记录下每个点重复出现的次数。这样就可以比较好的解决这个问题了。


 bool cmp(const Point& p1,const Point& p2) {     if(p1.x!=p2.x)     {         return p1.x<p2.x;     } return p1.y<p2.y; } void mySort(vector<Point>& points) { int n=points.size(); for(int i=1;i<n;++i) { int j=i-1; Point tmp(points[i].x,points[i].y); while((j>=0)&&(cmp(tmp,points[j]))) { points[j+1].x=points[j].x; points[j+1].y=points[j].y; j--; } points[j+1].x=tmp.x; points[j+1].y=tmp.y; } } bool equal(const Point& p1,const Point& p2) {     if((p1.x==p2.x)&&(p1.y==p2.y))     {         return true;     }     else     {         return false;     } } int nextPos(int start,const vector<Point>& points) {     int res=start+1;     while((res<points.size())&&(equal(points[start],points[res])))     {         res++;     }     return res; }class Solution {public:    int maxPoints(vector<Point> &points) {        int sz=points.size();        if(sz<3)        {            return sz;        }        //mySort(points);sort(points.begin(),points.end(),cmp);        int newSz=0;        vector<int> count(sz,0);        int i=0;        while(i<sz)        {            int nextI=nextPos(i,points);            int iSz=nextI-i;            //fillPos=i+1;            points[newSz]=points[i];            count[newSz]=iSz;            newSz++;            i=nextI;           }        if(newSz<3)        {            int res=0;            for(int i=0;i<newSz;++i)            {                res+=count[i];            }            return res;        }        int max=0;        for(int i=0;i<newSz;++i)        {            for(int j=i+1;j<newSz;++j)            {                int tmp=count[i]+count[j];                for(int k=0;k<newSz;++k)                {                    if((k!=i)&&(k!=j))                    {                        if(((points[i].y-points[j].y)*(points[i].x-points[k].x))==((points[i].y-points[k].y)*(points[i].x-points[j].x)))                        {                            tmp+=count[k];                        }                    }                }                if(tmp>max)                {                    max=tmp;                }            }        }        return max;    }};


0 0
原创粉丝点击