class Solution {
public:
/*暴力解法
int maxPoints(vector<vector<int>>& points) {
int n=points.size();
int res=1;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int cnt=2;
for(int k=j+1;k<n;k++){
if((points[j][1]-points[i][1])*(points[k][0]-points[j][0])==(points[k][1]-points[j][1])*(points[j][0]-points[i][0])){
cnt++;
}
}
res=max(res,cnt);
}
}
return res;
}
*/
//先枚举所有可能出现的直线斜率(根据两点确定一条直线,即枚举所有的「点对」),
//使用「哈希表」统计所有斜率对应的点的数量
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int maxPoints(vector<vector<int>>& points){
int res=1;
int n=points.size();
for(int i=0;i<n;i++){
// 由当前点 i 发出的直线所经过的最多点数量
map<string,int>h;
int m=1;
for(int j=i+1;j<n;j++){
int x1=points[i][0],y1=points[i][1],x2=points[j][0],y2=points[j][1];
int a=x1-x2,b=y1-y2;
int k=gcd(a,b);
string key=to_string(a/k)+"-"+to_string(b/k);
h[key]++;
m=max(m,h[key]+1);
}
res=max(res,m);
}
return res;
}
};
LeetCode149 直线上最多的点数
最新推荐文章于 2024-09-14 22:25:23 发布