class Solution {
public:
int maxPoints(vector<vector<int>>& points) {
typedef long double LD;
int res = 0;
for (auto &p : points)
{
int ss = 0, vs = 0; // 重叠的点数、垂直的点数
unordered_map<LD, int> cnt; // 斜率 该斜率表示的直线上的点数
for (auto &q : points)
{
if (p == q ) ss ++ ; // 重点
else if (p[0] == q[0]) vs ++ ; // 垂直线
else
{
LD k = (LD)(p[1] - q[1]) / (p[0] - q[0]); // 斜率k
cnt[k] ++ ; // 该斜率表示的直线上的点数+1
}
}
// 计算以p点为中心点的最多的共线的点的数量 先不加重叠的点,最后再统一加上
int c = vs;
for (auto &[k, v] : cnt ) c = max(c, v);
res = max(res, c + ss);
}
return res;
}
};