给你一个数组 points
,其中 points[i] = [xi, yi]
表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。
示例 1:
输入:points = [[1,1],[2,2],[3,3]] 输出:3
示例 2:
输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]] 输出:4
提示:
1 <= points.length <= 300
points[i].length == 2
-104 <= xi, yi <= 104
points
中的所有点 互不相同
枚举:
class Solution {
public:
int maxPoints(vector<vector<int>>& points) {
int n = points.size(), ans = 1; // 初始化,n 是点的数量,ans 记录最大共线点数,初始为1
for (int i = 0; i < n; i++) {
vector<int> x = points[i]; // 选取第 i 个点作为线的一端
for (int j = i + 1; j < n; j++) {
vector<int> y = points[j]; // 选取第 j 个点作为线的另一端
int cnt = 2; // 计数变量,初始为 2 表示 i 和 j 两个点
for (int k = j + 1; k < n; k++) {
vector<int> p = points[k]; // 选取第 k 个点,检查其是否与 i 和 j 共线
// 使用叉积公式判断三点是否共线
int s1 = (y[1] - x[1]) * (p[0] - y[0]); // 计算 (y2-y1)*(x3-x2)
int s2 = (p[1] - y[1]) * (y[0] - x[0]); // 计算 (y3-y2)*(x2-x1)
if (s1 == s2) cnt++; // 如果两个乘积相等,说明三点共线,计数加一
}
ans = max(ans, cnt); // 更新全局最大共线点数 ans
}
}
return ans; // 返回最终的最大共线点数
}
};
对于任意三个点(x1,y1),(x2,y2),(x3,y3),计算 (y2-y1)*(x3-x2) =(y3-y2)*(x2-x1),如果等式成立,说明三点共线。