https://leetcode-cn.com/problems/max-points-on-a-line/
思路一:直接暴力枚举,显然答案的那条直线至少涵盖
n
n
n个点中的某
2
2
2个点,因此直接
O
(
n
2
)
O(n^2)
O(n2)枚举直线上的两个点,再遍历一遍进行判断。复杂度
O
(
n
3
)
O(n^3)
O(n3)。为了避免斜率不存在等特殊情况,我们可以对判断公式进行移项。
class Solution {
public:
vector<int> p1,p2;
int maxPoints(vector<vector<int>>& points) {
int ans=1,n=points.size();
for(int i=0;i<n;i++)
{
p1=points[i];
for(int j=i+1;j<n;j++)
{
int tmp=0;
p2=points[j];
for(int k=0;k<n;k++)
tmp+=check(points[k]);
ans=max(ans,tmp);
}
}
return ans;
}
bool check(const vector<int> &p)
{
return (p[1]-p2[1])*(p2[0]-p1[0])==(p[0]-p2[0])*(p2[1]-p1[1]);
}
};
思路二:哈希。我们可以只枚举直线上的一个点,然后用一个哈希表存储所有可能出现的斜率,最后遍历哈希表统计答案即可。但是斜率通常是一个浮点数,会有精度误差,因此可以存储分子、分母最简二元组。同时也要注意斜率不存在和斜率为0的情况。代码就不贴了orz。