class Solution {
public:
int maxPoints(vector<Point> &points) {
if(points.size()<2)return points.size();
int localmax=0,vertical=0,overlap=0,result=0;
for(int i=0;i<points.size();i++)
{
map<pair<int,int>,int> lines;
localmax=0;vertical=0;overlap=0;
for(int j=i+1;j<points.size();j++)
{
if(points[i].x==points[j].x&&points[i].y==points[j].y)
{overlap++;continue;}
else if(points[i].x==points[j].x)
vertical++;
else
{
int a=points[i].x-points[j].x;
int b=points[i].y-points[j].y;
int gcd=GCD(a,b);
a=a/gcd;
b=b/gcd;
lines[make_pair(a,b)]++;
localmax=max(localmax,lines[make_pair(a,b)]);
}
localmax=max(localmax,vertical);
}
result=max(result,overlap+localmax+1);
}
return result;
}
int GCD(int a,int b)
{
if(b==0)return a;
else return GCD(b,a%b);
}
};