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;
}
};