LeetCode:find the maximum number of points that lie on the same straight line.

题目描述:

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

题意:

这道题目,是给出n个点,他们之间可以划线,求出哪条线上的点数最多,返回最多点的个数。注意重合点和垂直点

解题思路:

我一直的想法是,双循环遍历所有的点,求出所有直线的y=kx+b,及map<map<k,b>,count> ,然后垂直的点单独存储。然后遍历所有的点,看她在哪个k,b上如果在这条线的个数加一,然后还要判断是否也在垂直的线上。一直找不出这个方法的错误思路是否有错误。可能小数点精度有影响(自己的想法)。

正确的解题思路是,从第一个点开始,和其他的点开始比较。三个计数map<k,count>,重复count,垂直count,两个点确定一条直线嘛,所以如果是同一个点,重复的count+1,如果垂直,垂直count+1,否则map[k]+1.然后经过这个点的所有直线都有啦,(垂直和倾斜的)。然后求出这组直线,哪条直线点数最多,返回值就好,最终选出最大的值。

如图:

 

int maxPoints(vector<Point> &points) {
        if(points.size()==0){
        return 0;
    }
    if(points.size()==1 || points.size()==2){
        return points.size()==1?1:2;
    }
    int res=0;
    for(int i=0;i<points.size()-1;i++){
        map<float,int> maps;
        int curMax=1; //记录当前最大值
        int vline=0;  //记录垂直点数
        int dup=0;    //记录重复点数
        for(int j=i+1;j<points.size();j++){
            
                float ky=points[i].y-points[j].y;
                float kx=points[i].x-points[j].x;
                if(kx==0 && ky==0){
                        dup++;
                }else if(kx==0){
                    if(vline==0){
                        vline=2;
                    }else{
                        vline++;
                    }
                    curMax=max(curMax,vline);
                }else{
                    float k=ky/kx;
                    if(maps[k]==0){
                        maps[k]=2;
                    }else{
                        maps[k]++;
                    }
                    curMax=max(curMax,maps[k]);
                }
            
        }
        res=max(res,curMax+dup);
    }
    return res;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值