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.
Example 1:
Input: [[1,1],[2,2],[3,3]]
Output: 3
Explanation:
^
|
| o
| o
| o
±------------>
0 1 2 3 4
Example 2:
Input: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
Output: 4
Explanation:
^
|
| o
| o o
| o
| o o
±------------------>
0 1 2 3 4 5 6
解答
找到在同一条直线上的最多的点数。
主要的坑在于,有重复的点,所以遍历的时候要记录重复点的个数。
为了避开使用double,可以保存除数和被除数,但是除以了两者的最大公约数。用一个map<pair<int,int>, int>记录同一条直线上的个数。
class Solution {
public:
int maxPoints(vector<vector<int>>& points) {
if(points.empty() || points[0].empty())
return 0;
int res = 0;
int num = points.size();
for(int i=0;i<num;i++){
map<pair<int,int>,int> m;
int dup = 1;
for(int j = i+1;j<num;j++){
if(points[i][0] == points[j][0] && points[i][1] == points[j][1]) {
dup ++;
continue;
}
int dx = points[i][0] - points[j][0];
int dy = points[i][1] - points[j][1];
int d = gcd(dx, dy);
++m[{dx / d, dy / d}];
}
res = max(res, dup);
for(auto it = m.begin(); it != m.end(); ++it)
res = max(res, it->second + dup);
}
return res;
}
int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);
}
};
参考
https://www.cnblogs.com/grandyang/p/4579693.html