Max Points on a Line

本文针对LeetCode上一道关于寻找平面上共线点数量的最大值的问题进行解析,介绍了一种通过计算斜率的方法来解决该问题,并给出了详细的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode上一道很少有人做出来的题:

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

一开始就想到了应该跟求最短点对的算法相同,就是以一个点为定点,依次算每个点跟它的距离,遍历一遍求最小,然后选择下一个点用同样的方法。

这里应该是类似的,只是求得是斜率相同的两个点而已,即:

k=(y1-y2)/(x1-x2);

需要注意的地方我都在代码里加了注释,代码如下:

#include <iostream>
#include <vector>
using namespace std;
struct Point {
    int x;
    int y;
    Point() : x(0), y(0) {}
    Point(int a, int b) : x(a), y(b) {}
};
class Solution {
public:
int maxPoints(vector<Point> &points) {
if(points.size()<=0)return 0;  //没有点返回0
if(points.size()==1)return 1;  //有一个点返回1
if(points.size()==2)return 2;  //两个点肯定是一条直线
float k;       //与定点之间的斜率
int maxNum = 0;  //最大数
int maxCount;  //扫描一遍之后的最大值
for (int i= 0 ;i<points.size()-1;i++)
{
maxCount = 1;      //初始值是1,因为至少有一个点
int fenzi = points[i+1].y-points[i].y;
int fenmu = points[i+1].x-points[i].x;
if (fenmu==0)
k = 65535.0;         //若分母为0,则给一个很大的值
else
k = (float)fenzi/fenmu;   //斜率的计算,这里轮番对每一个点作为定点来计算
for (int j=0;j<points.size();j++)
{
float tmpk;
if(j!=i)
{
fenzi = points[j].y-points[i].y;
fenmu = points[j].x-points[i].x;
if (fenmu==0)
tmpk = 65535.0;
else
tmpk = (float)fenzi/fenmu;
if(tmpk == k)          //每一个点与定点之间的斜率相同则累加
maxCount++;
else if (points[j].y==points[i].y && points[j].x==points[i].x ) //判断两个点相同的情况
{
maxCount++;
}
}
}
maxNum = max(maxNum,maxCount);
}
return maxNum;
    }
};
void main()
{
Solution s;
vector<Point> points;
points.push_back(Point(1,1));
points.push_back(Point(1,1));
points.push_back(Point(2,3));
//points.push_back(Point(4,4));
//points.push_back(Point(5,6));
//points.push_back(Point(5,5));
//points.push_back(Point(6,6));
//points.push_back(Point(7,6));
int maxNum = s.maxPoints(points);
cout<<maxNum;
while(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值