[LeetCode] 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.
Hash Table Math
给出平面上的点,问一条直线最多穿过几个点.
要不是之前看过这个题的题解,我感觉可能会一点想法都木有...
我可能会去,枚举两个点,然后再枚举其他点是否在这个直线上,O(n^3).
实际上呢,我们只需要枚举一个点,然后再枚举其他点和这个点构成的斜率.
既然斜率相同,而且过一个点,当然在一个直线上啦.
然后找出构成的所有的斜率里面点最多的那个就ok啦.
不过要注意处理的是:
1,没有点
2,相同点(题意似乎是算做n个而不是一个)
3,斜率的话要注意垂直
4 后面处理的时候不需要计算前面的点,因为前面的点计算在计算相同的斜率的时候已经计算过了。。
class Solution { public: int maxPoints(vector<Point>& points) { if(points.size() == 0) return 0; if(points.size() == 1) return 1; if(points.size() == 2) return 2; int size = points.size(); map<double, int> hash; int duplicateCnt = 0; int rtn = 0; for(int i = 0; i < size; i++) { hash.clear(); duplicateCnt = 0; //calc the max number for each point for(int j = i + 1; j < size; j++) { if(points[i].x == points[j].x) { if(points[i].y == points[j].y) duplicateCnt++; else hash[double(INT_MIN)]++; } else { double k = ((double)(points[j].y-points[i].y))/(points[j].x-points[i].x); hash[k]++; } } if(duplicateCnt >rtn )// incase the hash is empty rtn = duplicateCnt; for(map<double,int>::iterator it = hash.begin(); it != hash.end(); it++) { if(it->second + duplicateCnt > rtn) rtn = it->second + duplicateCnt; } } return rtn + 1;//remember + 1, including the orginal point } };