149.直线上最多的点数

【LetMeFly】149.直线上最多的点数

力扣题目链接:https://leetcode.cn/problems/max-points-on-a-line/

给你一个数组 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 中的所有点 互不相同

方法一:看所有其他点与这个点的斜率

第一层遍历每一个点。

然后,第二层遍历再次遍历每一个点,求出两个点之间的斜率,并用哈希表计数。

因为都经过第一个点,所以斜率相同的点都在一条直线上。

取最大的斜率相同的点的个数,就是经过第一个点的直线中,经过点最多的直线所经过的点。

关于精度问题,C++中使用long double可以通过。

  • 时间复杂度$O(n^2)$,其中$n$是点的个数
  • 空间复杂度$O(n)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
long double ONE = 1;

class Solution {
public:
int maxPoints(vector<vector<int>>& points) {
int ans = 0;
int n = points.size();

for (int i = 0; i < n; i++) {
unordered_map<long double, int> ma;
int thisAns = 0;
for (int j = 0 ; j < n; j++) {
if (i == j)
continue;
long double k = ONE * (points[j][1] - points[i][1]) / (points[j][0] - points[i][0]);
ma[k]++;
thisAns = max(thisAns, ma[k]);
}
ans = max(ans, thisAns + 1);
}

return ans;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126084170


149.直线上最多的点数
https://blog.letmefly.xyz/2022/07/31/LeetCode 0149.直线上最多的点数/
作者
Tisfy
发布于
2022年7月31日
许可协议