给出平面上的点,问一条直线最多穿过几个点.
要不是之前看过这个题的题解,我感觉可能会一点想法都木有...
我可能会去,枚举两个点,然后再枚举其他点是否在这个直线上,O(n^3).
实际上呢,我们只需要枚举一个点,然后再枚举其他点和这个点构成的斜率.
既然斜率相同,而且过一个点,当然在一个直线上啦.
然后找出构成的所有的斜率里面点最多的那个就ok啦.
不过要注意处理的是:
1,没有点
2,相同点(题意似乎是算做n个而不是一个)
3,斜率的话要注意垂直
/** * 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) { if(points.size() == 0) return 0; unordered_map<double , int> count; int size = points.size(); int ans = 0; for(int i = 0 ; i < size ; i++){ int x = points[i].x; int y = points[i].y; int du = 0; count.clear(); count[(double)INT_MIN] = 0; for(int j = 0 ; j < size ; j++){ if(i != j){ int x1 = points[j].x; int y1 = points[j].y; if(x == x1 && y == y1){ du++; }else if(x == x1){ count[(double)INT_MAX] ++; }else{ double k = (double)(y1-y) / (double)(x1-x); count[k]++; } } } for(auto it = count.begin() ; it != count.end() ; it++){ if(it -> second + du> ans){ ans = it -> second + du; } } } return ans + 1; } };