大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
本题考察如何判断多个点是否在同一条直线上,以及如何统计在同一条直线上的点的个数。
题目解答方法的文字分析
我们可以使用斜率来判断多个点是否在同一条直线上,并使用哈希表来统计在同一条直线上的点的个数。
具体步骤如下:
- 遍历points中的每一对点i和j,计算i点和j点的斜率。
- 将斜率作为键,使用unordered_map来记录每个斜率对应的点的个数。
- 遍历哈希表,找到在同一条直线上的点的个数的最大值max_count。
- 返回max_count + 1作为结果,加1是因为还需要考虑i点本身。
需要注意的是,由于斜率可能是一个浮点数,为了避免精度问题,我们可以使用最简分数形式表示斜率。具体做法是求i点和j点的横纵坐标的差的最大公约数,然后将横纵坐标的差都除以最大公约数得到最简分数形式的斜率。
本题解析所用的编程语言 (C++)
C++
完整且正确的编程代码
class Solution { public: int maxPoints(vector<vector<int>>& points) { int n = points.size(); if (n <= 2) { return n; // 0个或者1个点时,直线上的点最多是它本身 } int max_count = 0; for (int i = 0; i < n; i++) { unordered_map<string, int> slope_count; // 斜率 -> 点的个数 int duplicate_count = 0; // 和i点重复的点的个数 for (int j = 0; j < n; j++) { if (i == j) continue; int dx = points[i][0] - points[j][0]; int dy = points[i][1] - points[j][1]; if (dx == 0 && dy == 0) { duplicate_count++; } else { int gcd_val = gcd(dx, dy); string slope = to_string(dy / gcd_val) + '/' + to_string(dx / gcd_val); slope_count[slope]++; } } max_count = max(max_count, duplicate_count); for (auto& [slope, count] : slope_count) { max_count = max(max_count, count + duplicate_count); } } return max_count + 1; // 加1是因为还需要考虑i点本身 } private: int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } };
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!