Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
基本思路:
本题是求解,在同一条直线上点的个数。最大值。
2点,能确定一条直线。 而判断第三点,是否位于该值线上。需要用到斜率。
即选定一个点,为基准点。 其他点,都对该点求斜率。 斜率相同的点,将位于一条直线。
求斜率所要特殊注意的是, 一种是,与基础点完全一样的点。因为分母分子都会为0.
另一种是,与基础点,垂直的点。因为分母会为0.
在leetcode上实际执行时间为28ms。
/**
* 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.empty())
return 0;
int ans = 0;
unordered_map<double, int> slopes;
for (int i=0; i<points.size(); i++) {
slopes.clear();
int verticals = 0;
int duplicates = 0;
int local = 0;
for (int j=i+1; j<points.size(); j++) {
if (points[i].x == points[j].x) {
if (points[i].y == points[j].y)
++duplicates;
else
++verticals;
}
else {
const double slope = double(points[j].y - points[i].y) / (points[j].x-points[i].x);
++slopes[slope];
local = max(local, slopes[slope]);
}
}
local = max(local, verticals);
local += duplicates;
ans = max(ans, local);
}
return ans+1;
}
};