[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;
}
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;
}
相关文章推荐
- [LeetCode]题解(python):149-Max Points on a Line
- LeetCode::Max Points on a Line
- Leetcode -- Max Points on a Line
- 【leetcode】Max Points on a Line
- LeetCode 149 Max Points on a Line
- 【leetcode】Max Points on a Line
- leetcode题解-149. Max Points on a Line
- Leetcode: 149. Max Points on a Line
- LeetCode: Max Points on a Line
- LeetCode:Max Points on a Line
- Leetcode: Max Points on a Line
- Leetcode: Max Points on a Line
- [LeetCode 第5题] -- Max Points on a Line
- 【Leetcode】Max Points on a Line
- 【LeetCode】Max Points on a Line
- #LeetCode Max Points On A Line
- LeetCode || Max Points on a Line
- LeetCode 149. Max Points on a Line
- [leetcode] 149. Max Points on a Line 解题报告
- [LeetCode]149 Max Points on a Line