原题:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
做这个题首先需要注意特殊情况,一是两个点相同,二是x相同,y不同,即斜率无穷大,double可以用std::numeric_limits<double>::infinity()表示
解题思路:
对每个点i进行如下操作:
1 用一个map<double,int>表示斜率k的直线有n个点(肯定是通过点i)
2 点i和其他每个点j都对比,如果点i和点j组成的斜率已经有了,则在map中对应的数字++,否则insert值为2(KEY)
3 如果有一个点j和点i一样,则把tempMax++;tempMax默认为1,表示至少有一个点(即点i)通过某条直线
3 将通过点i(第一个for循环)的所有直线上的最大点数保存在tempMax中
4 求result
代码如下(132ms):
/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector<Point> &points) {
unordered_map<double,int>mymap;
int result = 0;
for(int i = 0;i<points.size();i++){
mymap.clear();
//tempMax默认为1,表示起码点i在一条直线上
int tempMax = 1;
for(int j=0;j<points.size();j++){
if(i==j) continue;
//点i和点j
//斜率先假设为无穷大
double k = std::numeric_limits<double>::infinity();
//两个点的x不想等,求其斜率
if(points[i].x != points[j].x){
k = (double)(points[j].y-points[i].y)/(points[j].x-points[i].x);
}
//两个点相同,则把tempMax++;
else if(points[i].y == points[j].y){
tempMax++;
continue;
}
//如果该斜率第一次出现,这个斜率起码有两个点
if(mymap.find(k) == mymap.end()){
mymap.insert({k,2});
tempMax = max(tempMax,mymap[k]);
}
//如果斜率非第一次出现,则这个斜率的点数加1
else{
tempMax=max(tempMax , ++mymap[k]);
}
}
result = max(result,tempMax);
}
return result;
}
};