Given n points on a 2D plane, find the maximum number of points that lie on the same straight line
思路:最多的点,必然是点连成线时,所有斜率相同的最多的组合情况;
那么如果不在同一直线点的组合也可能斜率相同,找其中一点与其它点连即可。
#include <iostream> #include <vector> #include <map> using namespace std; 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() < 2) return points.size(); int result = 0; for (int i = 0; i < points.size(); i++) { map<pair<int, int>, int> line; int overlap = 0, vertical = 0, curMax = 0; for (int j = i + 1; j < points.size(); j++) { if((points[i].x == points[j].x) && (points[i].y == points[j].y)) { overlap ++; continue; } else if (points[i].x == points[j].x) { vertical ++; } else { int dx = points[i].x - points[j].x; int dy = points[i].y - points[j].y; int gcd = GCD(dx, dy); dx /= gcd; dy /= gcd; line[make_pair(dx, dy)]++; curMax = max(line[make_pair(dx, dy)], curMax); } curMax = max(vertical, curMax); } result = max(result, curMax+overlap+1); } return result; } int GCD(int a, int b) { if (b == 0) return a; return GCD(b, a%b); } }; int main() { vector<Point> points; points.push_back(Point(3, 4)); points.push_back(Point(3, 4)); points.push_back(Point(3, 4)); Solution *solution = new Solution(); cout << solution->maxPoints(points) << endl; // (3,10),(0,2),(0,2),(3,10) vector<Point> points2; points2.push_back(Point(3, 10)); points2.push_back(Point(0, 2)); points2.push_back(Point(0, 2)); points2.push_back(Point(3, 10)); cout << solution->maxPoints(points2) << endl; return 0; }
时间: 2024-10-12 16:27:40