题目
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
翻译:给定2D平面上的Ñ个点,找出位于同一直线上的最大点数。
算法思路
//注意:需要两重循环,第一重循环遍历起始点 a,第二重循环遍历剩余点 b
//当a与b不重合时,即可构成一条直线
//除点位于垂线上时需单独考虑外(因斜率为无穷大),其它点均可根据公式得出斜率
//对于每个点a,构建 斜率->点数 的map
//b与a重合,以a起始的所有直线点数+1 (用dup统一相加)
//b与a不重合,a与b确定的直线点数+1
知识点补充
map用法
map是一种二叉树的数据存储结构。map内部自建一颗红黑树
map的特点: (1)存储Key-value对(2)支持快速查找,查找的复杂度基本是Log(N)(3)快速插入,快速删除,快速修改记
map<string,int>mp;//这里的mp就是自己取的名字。定义map类型的变量mp
定义了一个map<int,int>FEL,怎么给FEl赋值(值为{2,1}{3,4}{4,5})
FEL[2] = 1;
FEL[3] = 4;
FEL[4] = 5;
代码详解
class Solution {
public:
intmaxPoints(vector<Point> &points) {
intnum = points.size();
if(num < 2) //考虑特殊情况,点数为0和1时,返回0或1
return num;
intret = 0; //必须定义一个相对两重循环的全局变量
for(int i=0; i<num; i++)
{
int dup = 0,vcnt = 1; //重复与垂直(必须放for循环里面,因每次i+1,都要重置参数开始计数)
int curmax = 1; //必须初始化,否则输入(0,0)(0,0)时,直接dup++,curmax未初始化取随机值了
map<double,int> mp;
for(int j=0; j<num; j++)
{
if(i!=j)//不是同一个点
{
double x1 = points[i].x - points[j].x; //注意:x1,y1必须为double型,否则计算斜率时,强制转换后会不准确
double y1 = points[i].y - points[j].y;
if(x1==0 && y1==0)
dup++;
else if(x1 == 0)
curmax = ++vcnt;
else
{
double k = y1/x1;
if(mp[k] == 0)//如果斜率对应的点数为0,则另其为2(说明之前没有这样斜率的点)
mp[k] = 2;
else
mp[k]++;
curmax =max(mp[k],curmax);
}
}
}
ret = max(ret, curmax+dup);//没轮完一轮(选取一个起始点,再与其他所有点连线判点数),判断一回
}
return ret;
}
};