[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.

 

Hide Tags
 Hash Table Math
 

 

给出平面上的点,问一条直线最多穿过几个点.

要不是之前看过这个题的题解,我感觉可能会一点想法都木有...

我可能会去,枚举两个点,然后再枚举其他点是否在这个直线上,O(n^3).

实际上呢,我们只需要枚举一个点,然后再枚举其他点和这个点构成的斜率.

既然斜率相同,而且过一个点,当然在一个直线上啦.

然后找出构成的所有的斜率里面点最多的那个就ok啦.

 

不过要注意处理的是:

1,没有点

2,相同点(题意似乎是算做n个而不是一个)

3,斜率的话要注意垂直

4 后面处理的时候不需要计算前面的点,因为前面的点计算在计算相同的斜率的时候已经计算过了。。

 

class Solution {
    public:
        int maxPoints(vector<Point>& points) {

            if(points.size() == 0)
                return 0;
            if(points.size() == 1) 
                return 1;
            if(points.size() == 2)
                return 2;

            int size = points.size();
            map<double, int> hash;
            int duplicateCnt = 0;
            int rtn = 0;

            for(int i = 0; i < size; i++)
            {
                hash.clear();
                duplicateCnt = 0;
                //calc the max number for each point
                for(int j = i + 1; j < size; j++)
                {
                    if(points[i].x == points[j].x)
                    {
                        if(points[i].y == points[j].y)
                            duplicateCnt++;
                        else
                            hash[double(INT_MIN)]++;
                    }
                    else
                    {
                        double k = ((double)(points[j].y-points[i].y))/(points[j].x-points[i].x);
                        hash[k]++;
                    }
                }

                if(duplicateCnt >rtn )// incase the hash is empty
                    rtn = duplicateCnt;
                    
                for(map<double,int>::iterator it = hash.begin(); it != hash.end(); it++)
                {
                    if(it->second + duplicateCnt > rtn)
                        rtn = it->second + duplicateCnt;
                }
            }
            return rtn + 1;//remember + 1, including the orginal point

        }
};

 

posted @ 2015-06-25 18:20  穆穆兔兔  阅读(226)  评论(0编辑  收藏  举报