1 题目描述
对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line
示例1
输入
[(0,0),(0,1)]
输出
2
示例2
输入
[(2,3),(3,3),(-5,3)]
输出3
解题思路
暴力搜索法:
建立一个列表,列表中的每一个元素还是一个列表。内层列表代表一条直线,即内层列表的元素为各个点,而外层列表是直线的集合。
我们遍历点的所有两两组合,然后判断其余点是否在这两个点构成的直线上,是则加入该直线,否则不做另外处理。
最后我们找到点最多的那条直线并输出该直线上点的数目。
代码实现
/**
* struct Point {
* int x;
* int y;
* };
*/
class Solution {
public:
/**
*
* @param points Point类vector
* @return int整型
*/
int maxPoints(vector<Point>& points) {
// write code here
int numOfPoints = points.size();
if(numOfPoints == 0) return 0;
if(numOfPoints == 1) return 1;
vector<vector<Point>> lines;
for(int i = 0; i < numOfPoints - 1; i++){
for(int j = i + 1; j < numOfPoints; j++){
Point point1 = points[i];
Point point2 = points[j];
vector<Point> line;
line.push_back(point1);
line.push_back(point2);
for(int k = 0; k < numOfPoints; k++){
if(k != i && k != j){
Point point3 = points[k];
if(pointEqualTo(point3, point1) || pointEqualTo(point3, point2)){
line.push_back(point3);
continue;
}
if(point2.x - point1.x == 0 && point3.x - point1.x == 0){
line.push_back(point3);
continue;
}
if(doubleEqualTo(calcGradient(point1, point3),
calcGradient(point1, point2))
&&doubleEqualTo(calcGradient(point2, point3),
calcGradient(point2, point1))){
line.push_back(point3);
}
}
}
lines.push_back(line);
}
}
int maxNumOfPoints = -1;
int numOfLines = lines.size();
for(int i = 0; i < numOfLines; i++){
int numOfPointsOfLineI = lines[i].size();
if(numOfPointsOfLineI > maxNumOfPoints){
maxNumOfPoints = numOfPointsOfLineI;
}
}
return maxNumOfPoints;
}
double calcGradient(Point point1, Point point2){
return (double)(point2.y - point1.y) / (double)(point2.x - point1.x);
}
bool doubleEqualTo(double doubleNum1, double doubleNum2){
return fabs(fabs(doubleNum1) - fabs(doubleNum2)) < 1e-5;
}
bool pointEqualTo(Point point1, Point point2){
return point1.x == point2.x && point1.y == point2.y;
}
};
运行结果
运行时间:26ms
占用内存:1160k