编写程序求过点最多的直线所对应的斜率和截距
题目: 首先第一行给你一个数字n,表示一共有n个点,第二行之后依次是点的坐标。请你输出过这些点最多的那条直线的斜率和截距。
输入示例: n 0,0 1,2 输出: 1.0000 0.0000
思路: map中以斜率和截距的键值对作为键,点出现的次数为值。通过嵌套循环依次求出两点的截距和斜率,统计其出现的次数存放在这个map中。然后遍历map寻找值最大的那个键,将这个值和它的键输出。
代码:
class StraightLine
{
struct Point
{
int _x;
int _y;
Point(int x=0,int y=0):_x(x),_y(y){
};
/*
使用初始化列表的好处:
1、类中存在常量,比如const int a;或者引用类型的成员属性,它们都必须初始化之后使用,因此必须使用初始化列表的方式进行构造
2、当前类的成员属性或者基类没有默认构造函数,所以只能使用初始化列表的方式
3、可以提高效率,例如:如果使用赋值方式进行构造,对于成员属性会先调用其默认构造函数,如果需要赋值的话,还需要调用拷贝构造,但是使用初始化列表的话可以将拷贝构造这一次调用省去,提高效率。
*/
}
//将计算的斜率和截距组队
pair<double,double> calculateSlopeAndIntercept(Point p1,Point p2)
{
double k=(p1.x-p2.x)/(p1.y-p2.y);//计算斜率
double b=p1.y-p1.x*k;
return make_pair(k,b);
}
//找出过点最多的直线的斜率和截距
vector<double> getLine(vector<Point> p,int n)
{
//在无序Map中存放对应斜率和截距出现的次数
unordered_map<pair<double,double>,int>map;
for(int i=0;i<p.size()-1;++i)
{
for(int j=i+1;j<p.size();++j)
{
++map[calculateSlopeAndIntercept(p[i],p[j])];
}
}
//遍历Map,找出出现次数最多的那个斜率和截距并返回
int max=0;//最多次数
auto tmp=map.begin();
auto resPair=tmp;
for(auto iter=map.begin();iter!=map.end();++iter)
{
if(iter->second>max)
{
max=iter->second;
resPair=iter;
}
}
//返回结果
vector<double,double>res(2,0);
res[0]=resPair->first.first;//map键的第一位表示斜率
res[1]=resPair->first.second;//map键的第二位表示截距
return res;
}
}
下一篇:
力扣217 存在重复元素
