题目如下:
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;
}
};