您的位置:首页 > 其它

leetcode 149: Max Points on a Line

2015-08-21 18:00 429 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: