支线任务六

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

给出一系列点,求出点的个数最多的那条直线。

两点确定一条直线,N个点就有N(N-1)/2条直线,相同直线数最多的在这条直线上点数就最多。另一个角度,一个点加一个斜率确定一条直线,相对于同一点dy/dx相同的点必定在同一条直线上。而且对于某一个点,另一个点与它的关系有三种,重合,dy/dx为正无穷,dy/dx为有限值。想明白了这些题目就变得很简单了。

class Solution {
public:
    int maxPoints(vector<Point>& points) {
        int n = points.size();
        if(n<3)
            return n;
        int result = 0;
        map<float,int> m;
        for(int i=0;i<n;i++) {
            int duplicate = 1;
            for (int j=i+1; j<n; j++) {
                if(points[j].x==points[i].x && points[j].y==points[i].y) duplicate++;//计算重合的点
                else if(points[j].x==points[i].x) m[INT_MAX]++;//斜率为无穷大的点
                else {
                    float k = (float)(points[j].y-points[i].y)/(points[j].x-points[i].x);
                    m[k]++;
                }
            }
            result=max(result,duplicate);//如果所有点都重合,map为空
            for(map<float,int>::iterator it=m.begin();it!=m.end();it++)
                result = max(result,it->second+duplicate);
            m.clear();
        }
        return result;
    }
};

运行结果:Runtime: 24 ms

原文地址:https://www.cnblogs.com/zizhao/p/5041467.html