Leetcode: Max Points on a Line

Given n points on a 2D plane, find themaximum number of points that lie on the same straight line.(題意大概是找尋某一條直線,其上包含的點最多。)

解決思路如下:

(1)若點a與點b與點c在同一條直線上,那麼它們的a和b,a和c所求的斜率是相等的。那麼我們可以從第一個點s開始,以第一個點s爲基點,去求其它的點與s的斜率,並分別統計具有相同斜率的點的個數並比較這些相同斜率的點的個數。

舉個例子,用hashmap統計斜率的個數,即聲明unordered_map<float,int> k_map;

總共有n個點:a,b,c,d.。b與a的斜率爲s1,則k_map[s1]++,c與a的斜率爲s2,則k_map[s2]++,d與a的斜率爲s1,則再次讓k_map[s1]++。直到其它的點遍歷完畢並且統計了斜率s1,s2,s3..上點的個數k_map[s1],k_map[s2],。然後遍歷k_map比較其中每個斜率表示的值求得最大值。

(3)然後再以第二個點爲基點,求其它點和它的斜率,並分別統計相同斜率的點的個數,再進行比較。步驟和(1)一樣。依次循環,最終求得一條直線上最大的點的數量。

代碼如下:

int maxPoints(vector<Point> &points) {
        unordered_map<float,int> k_map;
        int maxnum = 0;
        for(int i=0; i<points.size(); i++)
        {
            int vertical_num = 0;
            k_map.clear();
            int duplicate = 1;
            for(int j=0; j<points.size(); j++)
            {
                if(i==j) continue;
                else if(points[i].x == points[j].x && points[i].y == points[j].y)
                {
                    duplicate++;
                    continue;
                }
                if(points[i].x==points[j].x)
                    vertical_num++;
                else
                {
                    float k = (float)(points[i].y-points[j].y)/(points[i].x-points[j].x);
                    k_map[k]++;
                }
            }
            unordered_map<float,int>::iterator it = k_map.begin();
            if(vertical_num+duplicate > maxnum)
                maxnum = vertical_num+duplicate;
            for(;it != k_map.end(); ++it)
            {
                if(it->second+duplicate > maxnum)
                    maxnum = it->second+duplicate;
            }
        }
        return maxnum;
}

注意這裏用duplicate表示重複的點的個數,用vertical_num統計處於同一條垂直線上的點的個數。
發佈了35 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章