I couldn't think of a specific way to solve the problem until I learned the idea from others. First, choose the point one by one and make it the start point. Then, choose another point after that point and calculate the scope. Use the unordered map to count the number of scopes. After that, update the max number.
/**
* 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.empty())
return 0;
if(points.size()==1)
return 1;
unordered_map<double,int> count;
int count_inf,dup,max=0;
for(int i=0;i<points.size()-1;i++)
{
count.clear();
count_inf=0;//count the points on a vertical line
dup=1;//count points[i] itself
for(int j=i+1;j<points.size();j++)
{
if(points[i].x==points[j].x&&points[i].y==points[j].y)//duplicate point
dup++;
else if(points[i].x==points[j].x)//point j is on the vertical line of point i
{
if(count_inf)
count_inf++;
else
count_inf=1;
}
else
{
double k=(double)(points[j].y-points[i].y)/(points[j].x-points[i].x);
if(count.find(k)!=count.end())
count[k]++;
else
count[k]=1;
}
}
if(count_inf+dup>max)//this step can deal with that all points are duplicates
max=count_inf+dup;
for(unordered_map<double,int>::iterator it=count.begin();it!=count.end();it++)
if(it->second+dup>max)
max=it->second+dup;
}
return max;
}
};