- 题目描述
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
示例 1:
输入: [[1,1],[2,2],[3,3]]
输出: 3
解释:
^
|
| o
| o
| o
±------------>
0 1 2 3 4
示例 2:
输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出: 4
解释:
^
|
| o
| o o
| o
| o o
±------------------>
0 1 2 3 4 5 6
- 思路
主要分三种情况,如果有重合的点,将重合的点单独统计出来最后加进去;
如果两个点横坐标相同,纵坐标不同;最后一种横坐标不同,即可以算出斜率。 - C++实现
/**
* 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.size()<=0) return 0;
if(points.size()==1) return 1;
int res=1;//最终结果
for(int i=0;i<points.size()-1;i++)
{
map<string,int> m;
int repeat=0,vertical=0,curmax=1;//重复点、竖直点、当前最大加入点
for(int j=i+1;j<points.size();j++)
{
double disx=points[i].x-points[j].x;
double disy=points[i].y-points[j].y;
if(compare(disx,0.0)&&compare(disy,0.0))
{
repeat++;
}
else if(compare(disx,0.0))
{
if(vertical==0)
vertical=2;
else
vertical++;
curmax=vertical>curmax ? vertical:curmax;
}
else
{
double k=disy/disx;
string strk=transform(k);
if(m[strk]==0)
m[strk]=2;
else
m[strk]++;
curmax=m[strk]>curmax ? m[strk]:curmax;
}
}
res=res>(curmax+repeat) ? res:(curmax+repeat);
}
return res;
}
bool compare(double a,double b)
{
if((a-b)>-0.00000001 && (a-b)<0.00000001)
return true;
else
return false;
}
string transform(double a)
{
ostringstream os;
os << ( (int)(a * 1000000 + 0.5) ) / 1000000.0;
return os.str();;
}
};