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;
}
};
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;
}
};
相关文章推荐
- unity3d中,脚本的相互调用。
- 一首诗的代码
- 一首诗的代码
- 数据库 - 备份与恢复
- 动画-七夕言情
- 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- 大论文实验参考资料笔记
- RichEdit中插入带背景色文本的一种思路
- 最小组合数字【贪心+排序】
- linux下如何打开core dump
- Android性能优化典范(三)
- QTREE - Query on a tree 树链剖分 或者 动态树
- C#连接查询数据库
- C++ Primer 5e chapter 9.2
- 树状数组实践-HIT经理的烦恼
- Delphi中的THashTable
- JSChart
- Property Animation
- java开发个人总结笔记 小技巧