max-points-on-a-line

来源:互联网 发布:嵌入式系统 单片机 编辑:程序博客网 时间:2024/06/02 06:52
 需要两重循环,外循环遍历起始点a,内循环遍历剩余点b。
 
    a和b如果不重合,就可以确定一条直线。对于每个点a,构建 斜率->点数 的map
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)
的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。
    (1)b与a重合,以a起始的所有直线点数+1 (用dup统一相加)
 
    (2)b与a不重合,a与b确定的直线点数+1


C++代码实现:

/**
 * 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 size = points.size();
        if (size==0 || size==1){
            return size;
        }
        int ret = 0;//记录每一次外循环扫描结束后的同线最多点
        for (int i=0;i<size;i++){
            int curmax = 1;
            
            map<double,int> mp;//构造 斜率,点数的map
            int vcount = 1;//垂直点
            int dup = 0;//重复点
            for (int j=i+1;j<size;j++){
                double x1 = points[i].x - points[j].x;
                double y1 = points[i].y - points[j].y;
                if (x1==0 && y1 ==0){//重复
                    dup++;
                }else if (x1 == 0){//垂直
                    vcount++;
                    curmax = vcount>curmax?vcount:curmax;
                }else{//有斜率的情况
                    double k = y1/x1;
                    if (mp[k]==0){
                        mp[k]=2;
                    }else{
                        mp[k]++;
                    }
                    curmax = mp[k]>curmax?mp[k]:curmax;
                }
            }
            ret = max(curmax+dup,ret);
        }
        return ret;
    }
};
0 0