leetcode上一道很少有人做出来的题:
Given n points
on a 2D plane, find the maximum number of points that lie on the same straight line.
一开始就想到了应该跟求最短点对的算法相同,就是以一个点为定点,依次算每个点跟它的距离,遍历一遍求最小,然后选择下一个点用同样的方法。
这里应该是类似的,只是求得是斜率相同的两个点而已,即:
k=(y1-y2)/(x1-x2);
需要注意的地方我都在代码里加了注释,代码如下:
#include <iostream>
#include <vector>
using namespace std;
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; //没有点返回0
if(points.size()==1)return 1; //有一个点返回1
if(points.size()==2)return 2; //两个点肯定是一条直线
float k; //与定点之间的斜率
int maxNum = 0; //最大数
int maxCount; //扫描一遍之后的最大值
for (int i= 0 ;i<points.size()-1;i++)
{
maxCount = 1; //初始值是1,因为至少有一个点
int fenzi = points[i+1].y-points[i].y;
int fenmu = points[i+1].x-points[i].x;
if (fenmu==0)
k = 65535.0; //若分母为0,则给一个很大的值
else
k = (float)fenzi/fenmu; //斜率的计算,这里轮番对每一个点作为定点来计算
for (int j=0;j<points.size();j++)
{
float tmpk;
if(j!=i)
{
fenzi = points[j].y-points[i].y;
fenmu = points[j].x-points[i].x;
if (fenmu==0)
tmpk = 65535.0;
else
tmpk = (float)fenzi/fenmu;
if(tmpk == k) //每一个点与定点之间的斜率相同则累加
maxCount++;
else if (points[j].y==points[i].y && points[j].x==points[i].x ) //判断两个点相同的情况
{
maxCount++;
}
}
}
maxNum = max(maxNum,maxCount);
}
return maxNum;
}
};
void main()
{
Solution s;
vector<Point> points;
points.push_back(Point(1,1));
points.push_back(Point(1,1));
points.push_back(Point(2,3));
//points.push_back(Point(4,4));
//points.push_back(Point(5,6));
//points.push_back(Point(5,5));
//points.push_back(Point(6,6));
//points.push_back(Point(7,6));
int maxNum = s.maxPoints(points);
cout<<maxNum;
while(1);
}