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