题目描述
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
/**
* Definition for a point.
* 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) {
int size = points.size();
if(size == 0)
return 0;
else if(size == 1)
return 1;
int ret = 0;
for(int i = 0;i<size;i++){
int curmax = 1;
map<double,int>mp;
int vcnt = 0; //垂直点
int dup = 0; //重复点
for(int j = 0;j<size;j++){
if(j!=i){
double x1 = points[i].x - points[j].x;
double y1 = points[i].y - points[j].y;
if(x1 == 0 && y1 == 0){ //重复
dup++;
}else if(x1 == 0){ //垂直
if(vcnt == 0)
vcnt = 2;
else
vcnt++;
curmax = max(vcnt,curmax);
}else{
double k = y1/x1; //斜率
if(mp[k] == 0)
mp[k] = 2;
else
mp[k]++;
curmax = max(mp[k],curmax);
}
}
}
ret = max(ret,curmax+dup);
}
return ret;
}
};
class Solution {
public:
int maxPoints(vector<Point> &points) {
int maxNum =0;
int size = points.size();
int i,j;
if(size <=2) //如果点的个数小于3个,则最大数目为点的个数
return size;
for(i=0;i<size;i++)
{
int cnt =0;
double slope;
map<double,int> mp;
for(j=0;j<size;j++)
{
if(i==j)
continue;
if(points[i].x == points[j].x && points[i].y == points[j].y)
{
cnt++;
continue;
}
//注意当直线与y轴平行的情况
if(points[i].x == points[j].x)
{
slope = INT_MAX;
}
else{
slope = (double)(points[j].y - points[i].y)/(points[j].x - points[i].x);
}
++mp[slope];
}
if(mp.size()==0) //防止mp为空时,下面的for循环不执行
{
maxNum = cnt;
}
else{
for(auto it = mp.begin();it !=mp.end();++it)
{
if(it->second+ cnt > maxNum)
maxNum = it->second +cnt;
}
}
}
return maxNum+1;
}
};
相似问题
题目描述
在二维平面上,有一些点,请找出经过点数最多的那条线。
给定一个点集vectorp和点集的大小n,没有两个点的横坐标相等的情况,请返回一个vector,代表经过点数最多的那条直线的斜率和截距。
/*
struct Point {
int x;
int y;
Point() :
x(0), y(0) {
}
Point(int xx, int yy) {
x = xx;
y = yy;
}
};*/
class DenseLine {
public:
pair<double, double> calLine(Point p1,Point p2){
double k = (double)(p1.y - p2.y)/(double)(p1.x - p2.x);
double s = (double)p1.y - (double)k*p1.x;
return make_pair(k,s);
}
vector<double> getLine(vector<Point> p, int n) {
map<pair<double, double>, int > lines;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
++lines[calLine(p[i],p[j])];
}
}
int max = 0;
auto a = lines.begin();
auto maxLine = a;
for(auto i = lines.begin();i!= lines.end();++i )
{
if(i->second > max)
{
max = i->second;
maxLine = i;
}
}
vector<double> res;
res.push_back(maxLine->first.first);
res.push_back(maxLine->first.second);
return res;
}
};