# max-points-on-a-line(穿过点最多的直线)

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

/**
* 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) {
int size = points.size();
if(size == 0)
return 0;
else if(size == 1)
return 1;

int ret = 0;
for(int i = 0;i<size;i++){

int curmax = 1;
map<double,int>mp;
int vcnt = 0; //垂直点
int dup = 0; //重复点
for(int j = 0;j<size;j++){

if(j!=i){
double x1 = points[i].x - points[j].x;
double y1 = points[i].y - points[j].y;
if(x1 == 0 && y1 == 0){   //重复
dup++;
}else if(x1 == 0){      //垂直
if(vcnt == 0)
vcnt = 2;
else
vcnt++;
curmax = max(vcnt,curmax);
}else{
double k = y1/x1;          //斜率
if(mp[k] == 0)
mp[k] = 2;
else
mp[k]++;
curmax = max(mp[k],curmax);
}
}
}
ret = max(ret,curmax+dup);
}
return ret;

}
};
class Solution {
public:
int maxPoints(vector<Point> &points) {
int maxNum =0;
int size = points.size();
int i,j;

if(size <=2)   //如果点的个数小于3个，则最大数目为点的个数
return size;
for(i=0;i<size;i++)
{
int cnt =0;
double slope;
map<double,int> mp;
for(j=0;j<size;j++)
{
if(i==j)
continue;
if(points[i].x == points[j].x && points[i].y == points[j].y)
{
cnt++;
continue;
}
//注意当直线与y轴平行的情况
if(points[i].x == points[j].x)
{
slope = INT_MAX;
}
else{
slope = (double)(points[j].y - points[i].y)/(points[j].x - points[i].x);
}
++mp[slope];
}

if(mp.size()==0)   //防止mp为空时，下面的for循环不执行
{
maxNum = cnt;
}
else{
for(auto it = mp.begin();it !=mp.end();++it)
{
if(it->second+ cnt > maxNum)
maxNum = it->second +cnt;
}
}

}
return maxNum+1;
}
};

/*
struct Point {
int x;
int y;
Point() :
x(0), y(0) {
}
Point(int xx, int yy) {
x = xx;
y = yy;
}
};*/
class DenseLine {
public:
pair<double, double> calLine(Point p1,Point p2){
double k = (double)(p1.y - p2.y)/(double)(p1.x - p2.x);
double s = (double)p1.y - (double)k*p1.x;
return make_pair(k,s);
}
vector<double> getLine(vector<Point> p, int n) {
map<pair<double, double>, int > lines;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
++lines[calLine(p[i],p[j])];
}
}

int max = 0;
auto a =  lines.begin();
auto maxLine = a;
for(auto i =  lines.begin();i!=  lines.end();++i )
{
if(i->second > max)
{
max = i->second;
maxLine = i;
}
}
vector<double> res;
res.push_back(maxLine->first.first);
res.push_back(maxLine->first.second);
return res;

}
};