標籤:style blog color io os for div sp log
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;}
leetcode-[3]Max Points on a Line