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