Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
分析: 任取两点组成的直线,看有多少点在其上面。
注意: 考虑 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) { int max_points(0); double a(0), b(0); // denote a straight line LINE_TYPE line_type(LINE); if(points.size() == 0) return 0; else if(points.size() == 1) return 1; for(int i=0; i<points.size(); ++i) for(int j=i+1; j<points.size(); ++j) { if(points[i].x == points[j].x){ if(points[i].y == points[j].y) line_type = POINT; else line_type = VLINE; } else{ line_type = LINE; a = (points[j].y - points[i].y) / static_cast<double>(points[j].x - points[i].x); //tangent b = points[i].y - a * points[i].x; } // compute how many points on the line int point_count(2); for(int k=0; k<points.size(); ++k){ if(k == i || k == j) continue; // test whether points[k] on the line if(line_type == LINE){ if( fabs(points[k].y - a*points[k].x - b) < 1e-10) ++ point_count; } else if(line_type == POINT){ if(points[k].x == points[i].x && points[k].y == points[i].y) ++ point_count; } else{ if(points[k].x == points[i].x) ++ point_count; } } max_points = max(max_points, point_count); } return max_points; } private: enum LINE_TYPE{POINT, LINE, VLINE}; };
LeetCode----Max Points On a Line
原文:http://blog.csdn.net/shoulinjun/article/details/19152791