Max Points on a Line

来源:互联网 发布:ubuntu打开u盘命令 编辑:程序博客网 时间:2024/05/17 23:27


Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.


/** * 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() <= 1) {return points.size();}vector<double> radius;vector<vector<unsigned> > lines;vector<vector<unsigned> > duplication(points.size());unsigned i = 0, j;vector<bool> ignor(points.size(), false);for (; i < points.size(); i++) {if (ignor[i]) {continue;}vector<unsigned> dup;dup.empty();dup.push_back(i);for (j = i + 1; j < points.size(); j++) {double a;if (points[i].x == points[j].x) {if (points[i].y == points[j].y) {dup.push_back(j);ignor[j] = true;continue;}a = INT_MIN;} else {a = (double)(points[i].y - points[j].y)/ (double)(points[i].x - points[j].x);}if (radius.size() == 0) {vector<unsigned> tp;tp.push_back(i);tp.push_back(j);lines.push_back(tp);radius.push_back(a);} else {unsigned z = 0, m, n;bool sameline = false, has = false;for (; z < radius.size(); z++) {if (radius[z] == a) {for (m = 0; m < lines[z].size(); m++) {if (lines[z][m] == i) {sameline = true;for (n = m + 1; n < lines[z].size(); n++) {if (lines[z][n] == j) {has = true;break;}}if (!has) {lines[z].push_back(j);}break;}}}if (sameline)break;}if (!sameline) {vector<unsigned> tp;tp.push_back(i);tp.push_back(j);lines.push_back(tp);radius.push_back(a);}}}duplication[i]=dup;}unsigned max = 0;for (i = 0; i < lines.size(); i++) {unsigned total = 0;if (!ignor[lines[i][j]]) {total += duplication[lines[i][j]].size() - 1;}max = lines[i].size() + total > max ? lines[i].size() + total : max;}return max;}};


0 0