给定二维平面上的n个点,找到位于同一直线上的最大点数
程序员文章站
2022-04-02 18:21:44
...
参考https://blog.csdn.net/baidu_37964071/article/details/81021935
- 我们都知道,两点可以确定一条直线,而且可以写成y = ax + b的形式,在一条直线上的点都满足这个公式。所以这些给定点两两之间都可以算一个斜率,每个斜率代表一条直线,对每一条直线,带入所有的点看是否共线,并计算个数,这是整体的思路。
- 当两个点重合时,无法确定一条直线,但这也是共线的情况,需要特殊处理。
- 当斜率不存在时,由于两个点(x1, y1)和(x2, y2)的斜率k表示为(y2 - y1) / (x2 - x1),那么当x1 = x2时斜率不存在,这种共线情况需要特殊处理。
- 我们需要用到哈希表来记录斜率和共线点个数之间的映射,其中第一种重合点的情况我们假定其斜率为INT_MIN,第二种情况我们假定其斜率为INT_MAX,这样都可以用map映射了。
- 我们还需要定一个变量duplicate来记录重合点的个数,最后只需和哈希表中的数字相加即为共线点的总数。
测试用例:
[(0,0),(1,1),(0,0)]
对应输出应该为:
3
测试用例:
[(84,250),(0,0),(1,0),(0,-70),(0,-70),(1,-1),(21,10),(42,90),(-42,-230)]
对应输出应该为:
6
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
/**
给定二维平面上的n个点,找到位于同一直线上的最大点数
*/
struct Point {
int x;
int y;
Point() { x = 0; y = 0; }
Point(int a, int b) { x = a; y = b; }
};
class Solution {
public:
int max(int a, int b) {
return a > b ? a : b;
}
int maxPoints(vector<Point> &points) {
int size = points.size();
if (size <= 2) {
return size;
}
int res = 0;
for (int i = 0; i < size; i++) {
map<float, int> kmap; //斜率为k的点对数
int d = 1;
for (int j = i+1; j < size; j++) {
if (points[i].x == points[j].x) {
if (points[i].y == points[j].y) { //两个点重合
d++; //重合的点数
}
else { //斜率不存在
kmap[INT_MAX]++;
}
}
else {
float k = (points[i].y - points[j].y)*1.0 / (points[i].x - points[j].x);
kmap[k]++;
}
}
res = max(res, d);
for (auto it = kmap.begin(); it != kmap.end(); it++) {
res = max(res, it->second + d);
}
}//
return res;
}
};
int main()
{
vector<Point> points;
int n;
cin >> n;
int x, y;
for (int i = 0; i < n; i++) {
cin >> x >> y;
Point point(x, y);
points.push_back(point);
}
Solution so;
int maxNum=so.maxPoints(points);
cout <<maxNum << endl;
return 0;
}
下一篇: 纸牌游戏
推荐阅读
-
leetcode 给定二维平面上的n个点,找到位于同一直线上的最大点数
-
编程题—给定位于二维平面上的n个点,求出位于同一条直线上的最大点数
-
给定二维平面上的n个点,找到位于同一直线上的最大点数
-
LeetCode:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
-
给定2D平面上的n个点,找到位于同一直线上的最大点数
-
[leetcode]给定二维平面上的n个点,找出位于同一直线上的点的最大数目
-
Leetcode打卡2:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
-
给定二维平面上的n个点,找出位于同一直线上的点的最大数目
-
对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上java实现
-
枚举:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上