Leetcode Max Points on a Line

OpenSoucre發表於2014-06-18

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

此題是求直線上點最多的點數,

根據兩點構成一條直線,在同一條直線上,任意兩點之間的斜率都相同,故需要對每個點遍歷一遍,

假設遍歷點為k,則過k的所有直線上點數最多的點能被求出(通過其他點到點k得斜率判斷,如果斜率相等,則在同一條直線上),

然後取最大值即可。

注意本題要考慮相同點得處理,以及斜率無窮大的處理,

相同點得處理,只需要記錄相同點數即可

斜率無窮大得處理,只需要記斜率為INT_MAX即可

程式碼用到了unordered_map,即雜湊表,存取時間複雜度為O(1)

本題的整體複雜度為O(n*n)

int maxPoints(vector<Point> &points){
    if(points.size()  <= 2) return points.size();
    int maxCnt = 1;
    for(int i = 0 ; i < points.size(); ++ i){
        int dup = 0;
        unordered_map<double,int> kmap;
        kmap.insert(make_pair(INT_MIN,1));
        for(int j = i + 1; j < points.size(); ++ j){
            if(points[j].x == points[i].x && points[j].y == points[i].y) dup++;
            else{
                double k = points[j].x-points[i].x == 0 ? INT_MAX:(double)(points[j].y - points[i].y)/(double)(points[j].x - points[i].x);
                if(kmap.find(k)!=kmap.end()) kmap[k]++;
                else kmap.insert(make_pair(k,2));
            }
        }
        for(unordered_map<double,int>::iterator iter = kmap.begin(); iter!=kmap.end(); ++ iter){
            if(iter->second+dup > maxCnt) maxCnt = iter->second+dup;
        }
    }
    return maxCnt;
}

 本題的改進型可以為3D平面,求出在同一個平面上最多的點數

 

 

相關文章