【LeetCode】max-points-on-a-line一條線上最多點

題幹

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
在一個2D平面中,找到點集中在一條直線上最多的有多少個點。

數據結構

 * 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()<=0)
            return 0;//點集爲空
        if (points.size()==1)
            return 1;//點集中只有一個點

        int res=0;//定義好結果
        for(int i=0;i<points.size();i++){//i爲當前參考點
            int vcnt=0,dup=0,curmax=1;//垂直的一條線的點,重合的點,當前的共線點的最大值
            double delta_x=0,delta_y=0,k=0.0;
            map<double,int>mp;//哈希表存儲相同斜率的點的數量
            for(int j=0;j<points.size();j++){
                if (j!=i){
                    delta_x=points[i].x-points[j].x;
                    delta_y=points[i].y-points[j].y;
                    if (delta_x==0&&delta_y==0){//重合點
                        dup++;
                    }
                    else if (delta_x==0){//垂直線上的點
                        if (vcnt==0)
                            vcnt=2;
                        else vcnt++;
                        curmax=max(vcnt,curmax);
                    }
                    else {
                        k=delta_y/delta_x;
                        if (mp[k]==0)
                            mp[k]=2;
                        else mp[k]++;
                        curmax=max(mp[k],curmax);
                    }
                }
            }
        res=max(res,curmax+dup);//重合點要加載結果中
        } 
        return res;
    }
};

易錯點

特殊關係

1.兩點在垂直座標軸的線上時,斜率是不存在的。需要單獨考慮。
2.幾個點重合在點集中也是算多個元素的,需要單獨討論。於是標記dup爲是否與參考點重合,以便在算後面斜率相同時加上dup。

初始化位置

1.curmax初始化是在第一層循環初始化的,故每有一個新的i,即新的參考點的時候就會重新初始化curmax。如果在循環外初始化的話,前面一個點的參考點的curmax如果大於後面一個參考點的,而後面又有重合點dup的時候,會得到 res=前一個curmax+後一個dup的結果,這個結果顯然是不對的。
2.哈希表的初始化是在第一層循環之後的,也就是說每個參考點有一個哈希表來存儲。這樣使得都是以參考點爲基準比較,直接用斜率會出現幾組點斜率相同平行但不共線的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章