LeetCode149:Max Points on a Line

mickole發表於2014-02-16

題目:

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

解題思路:

1,在所有點中選定一個點作為中心點,然後再求剩下的點到該中心點的斜率,如果斜率相同的點表示在同一直線上

2,如果剩下點中有與中心點相同的點,則記下相同點的個數,然後直接跳過,繼續下一個點到中心點斜率的求解

3,為了防止重複計算,當以節點i作為中心節點時,剩餘的點表示為陣列中i點後面的點

實現程式碼:

#include <iostream>
#include <vector>
#include <map>
#include <limits>
#include <unordered_map>
using namespace std;

/*

*/ 
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;
        int max = 0;
        map<double, int> umap; 
        for(int i = 0; i < points.size(); i++)
        {
            int tmp_max = 0;//當已第i個點位中心時,同一直線上點數最大值 
            umap.clear();
            int repeat = 0;//與i點相同點的個數 
            for(int j = i+1; j < points.size(); j++)
            {
                double slope = numeric_limits<double>::infinity(); 
                if(points[j].x != points[i].x)
                    slope = double(points[j].y - points[i].y) / (points[j].x - points[i].x);
                else if(points[j].y == points[i].y)//與中心點相同的點
                {
                    repeat++;
                    continue;                   
                }
                umap[slope]++;//到中心點斜率相同的點數++,這裡umap中存在該斜率,則直接將該斜率對應的值++,否則先新增,再++
                if(umap[slope] > tmp_max)
                    tmp_max = umap[slope];                               
            }
            tmp_max += repeat;//以i為中心點出發的每一條直線上的點數都應該加上repeat,因為與i點相同的點在所有從i出發的直線上 
            if(tmp_max > max)
                max = tmp_max;//更新全域性最大值 
            
        }
        return max + 1; //之前所求的每一條直線上的點數都沒有加上該直線的中心點,所以這裡要加上1   
    }
};




int main(void)
{
    Point ps[] = {{2,3},{2,3},{2,3}};
    int len = sizeof(ps) / sizeof(Point);
    vector<Point> points(ps, ps+len);
    Solution solution;
    int ret = solution.maxPoints(points);
    cout<<ret<<endl;
    return 0;
}

相關文章