Max Points on a Line

题目149: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.

题目分析:
计算在在一条直线上的点最多的个数。
两个不同的点A、B确定一条直线,这是显然的,如何判断第三个点C,在这两个点确定的一条直线上,如果A和C的斜率等于A和B的斜率,则C在A和B确定的直线上。
好了,该题有思路了,参考[2]思路写的清晰,参考[1]代码写的清晰,是我的喜欢的风格,希望自己代码也可以写的这么清晰。

思路分析:

  • 以某点O为中心,计算它和其他所有点的斜率,如果直线OA的斜率等于直线OB的斜率,则OAB三点公线,求出包括O点的直线上包含点最多的个数K(O);
  • 再依次求出包含剩余点的直线上包含点最多的个数,取最大值得出结果,时间复杂度是O(N^2)。
    • 因为每次求斜率都要比较是否有相等的斜率,再修改统计的个数,所以为了效率,可以采用哈希表来保存斜率值,unordered_map< float slope, int count>。
    • 如果有重复的点,要统计重复的点的个数dup,则实际在同一条直线上点的个数是K(O) + dup。

这里为了避免重复计算,以数组中第i个点为中心时,只计算数组中它右边的所有点(为什么这么做对,因为只求max,max肯定也是大于前面求过的值的)

代码如下:

/**
 * 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) {
        int len = points.size();
        /* 注释(1) */
        if (len <= 2)
            return len;
        int max = 0;
        unordered_map<float, int> mp;
        for (int i = 0; i < len; i ++) {
            mp.clear();
            /* 注释(2) */
            int dup = 1;
            /* 注释(3) */
            mp[INT_MIN] = 0;
            for (int j = i + 1; j < len; j ++) {
                if (points[i].x == points[j].x && points[i].y == points[j].y) {
                    ++ dup;
                    continue;
                } 
                /* 注释(4) */
                float slope = (points[i].x == points[j].x) ? INT_MAX : (float)(points[i].y - points[j].y) / (points[i].x - points[j].x);
                mp[slope] ++;  
            }
            unordered_map<float, int>::iterator iter = mp.begin();
                for (; iter != mp.end(); iter ++)
                    if (iter->second + dup > max)
                        max = iter->second + dup;
        }
        return max;
    }
};

注释:

(1)如果点数少于2个,直接返回点的个数,两个点才可以确定一条直线;
(2)dup为什么初始化是1,这个如果是3个点时,两个点重复,应该返回3,如果dup初始化是0,则返回2,错误,因为两个点确定一条直线,少算了当前点;
(3)mp[INT_MIN],如果都是重复的点,则mp是空,iter是空,返回max是0,错误;
(4)斜率是无穷大还是正常取值;

参考:
[1] http://blog.csdn.net/doc_sgl/article/details/17103427
[2] http://www.cnblogs.com/TenosDoIt/p/3444086.html

猜你喜欢

转载自blog.csdn.net/zxc995293774/article/details/49081147