您的位置:首页 > 其它

[leetcode]Max Points on a Line

2017-06-18 20:05 323 查看
Max Points on a Line

Difficulty:Hard

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

题目就是给定一堆点,判断最多有多少点共线。

我的做法是先算数两两点之间的线段一次方程,然后通过判断相同的方程个数来判断共线的点数。

要注意的是,相同的方程数不等于共线点数,等于的是共线点之间的全连接,也就是完全图中的线的数量,比如共线点数为3,则相同方程为3,共线点数为4,则相同方程为6,也就是n(n-1)/2,n就是共线点数。同时还要注意精度的问题,精度要求高的地方使用long
double类型。 int maxPoints(vector<Point>& points) {
if (points.size() <= 1)
return points.size();
//设方程为y=kx+c
vector<pair<pair<int, long double>, double>> line;//记录两两点之间的方程 int记录方程是否与x轴垂直 long double为k double为c
int result = 0;
for (int i = 0; i<points.size(); i++){
for (int j = i + 1; j<points.size(); j++){

Point p1 = points[i];
Point p2 = points[j];
if ((p2.x - p1.x) != 0){//判断是否与x轴垂直
long double k = (p2.y - p1.y) / (long double)(p2.x - p1.x);
double c = p2.y - ( double)(k*p2.x);
char s[20];
double dRetval;
sprintf(s, "%.*lf", 5, c);//c保留5位小数
sscanf(s, "%lf", &dRetval);
c = dRetval;
pair<int, long double> part(0, k);
pair<pair<int, long double>, double> perLine(part, c);
line.push_back(perLine);
}
else{
pair<int, long double> part(1, 0);
pair<pair<int, long double>, double> perLine(part, p1.x);
line.push_back(perLine);
}
}
}
vector<pair<pair<int, long double>, double>> uLine;
uLine.assign(line.begin(), line.end());
//sort(uLine.begin(), uLine.end());
uLine.erase(unique(uLine.begin(), uLine.end()), uLine.end());//去除重复

for (int i = 0; i<uLine.size(); i++){//判断有多少重复的方程 找出最大的重复次数
int tmpResult = 0;
for (int j = 0; j<line.size(); j++){
if (uLine[i] == line[j])
tmpResult++;
}
if (tmpResult>result)
result = tmpResult;
}
//通过n(n-1)/2=result,解出n
int drt = 1 + 8 * result;
result = ceil((sqrt(drt) + 1) / 2);
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: