您的位置:首页 > 其它

LeetCode -- Max Points on a Line

2014-09-06 10:36 375 查看
题目如下:

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

------------------------------------------------------------------------------

最开始的时候感觉这个题目好像很难,后来想想,直接用暴力不就解决了吗?

中间遇到几个坑:

1. 两点确定一条直线,但是这两个点必须是不同的点;

2.  当两点的x或者y值相同的时候,要特殊处理一下;

3.  当点集中存在重复的点的时候,要考虑几种情况:如果点集中的点都是相同的点,那么按照1的原则就不能找到两个不同的点,此时要特殊处理下;如果点集中有相同的点,但是不止一个位置的时候,1和2其实就可以处理了,这种情况不需要特殊对待。

4. 当用sort对点集进行排序的时候,要自己写一个比较函数,直接用bool comp()这个函数编译总是不通过,用struct 定义operator就可以,知识盲点。

代码如下:

/**
* 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) {
if(points.size() < 3)
return points.size();
sort(points.begin(), points.end(), myobj);
if(same(*(points.begin()), *(points.rbegin())))
return points.size();
int max = 0;
for(int i = 0; i < points.size(); ++i)
{
for(int j = i+1; j < points.size(); ++j)
{
int cnt = 0;
if(same(points[i], points[j])){
continue;
}
for(int k = 0; k < points.size(); ++k)
cnt += isLine(points[i], points[j], points[k]);
max = max >= cnt ? max : cnt;
}
}
return max;
}
struct myclass{
bool operator()(Point a, Point b){
return a.x < b.x || (a.x == b.x && a.y < b.y);
}
}myobj;
bool same(Point a, Point b){
return a.x == b.x && a.y == b.y;
}
int isLine(Point a, Point b, Point c)
{
if(a.x == b.x && a.x == c.x)
return 1;
if(a.y == b.y && a.y == c.y)
return 1;
if((a.x - b.x)*(a.y-c.y) == (a.y-b.y)*(a.x-c.x))
return 1;
return 0;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: