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.


解题思路
这个题比较简单,主要思想简单讲是找斜率相同的点。具体说就是以一个点为基准,与其他所有点计算斜率,找到与这点斜率相同的各个点,得到一条直线的最多点。 
需要两层循环: 
第一层,遍历参考点。 
第二层,除了参考点外的所有点,与参考点进行斜率的计算,存储斜率相同的点的数量。

比较每个参考点中最多点数,找到最大的。


/**
 * 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) {
        if (points.size()<=0)
            return 0;//点集为空
        if (points.size()==1)
            return 1;//点集中只有一个点

        int res=0;//定义好结果
        for(int i=0;i<points.size();i++){//i为当前参考点
            int vcnt=0,dup=0,curmax=1;//垂直的一条线的点,重合的点,当前的共线点的最大值
            double delta_x=0,delta_y=0,k=0.0;
            map<double,int>mp;//哈希表存储相同斜率的点的数量
            for(int j=0;j<points.size();j++){
                if (j!=i){
                    delta_x=points[i].x-points[j].x;
                    delta_y=points[i].y-points[j].y;
                    if (delta_x==0&&delta_y==0){//重合点
                        dup++;
                    }
                    else if (delta_x==0){//垂直线上的点
                        if (vcnt==0)
                            vcnt=2;
                        else vcnt++;
                        curmax=max(vcnt,curmax);
                    }
                    else {
                        k=delta_y/delta_x;
                        if (mp[k]==0)
                            mp[k]=2;
                        else mp[k]++;
                        curmax=max(mp[k],curmax);
                    }
                }
            }
        res=max(res,curmax+dup);//重合点要加载结果中
        } 
        return res;
    }
};



易错点
特殊关系
1.两点在垂直坐标轴的线上时,斜率是不存在的。需要单独考虑。 
2.几个点重合在点集中也是算多个元素的,需要单独讨论。于是标记dup为是否与参考点重合,以便在算后面斜率相同时加上dup。


初始化位置
1.curmax初始化是在第一层循环初始化的,故每有一个新的i,即新的参考点的时候就会重新初始化curmax。如果在循环外初始化的话,前面一个点的参考点的curmax如果大于后面一个参考点的,而后面又有重合点dup的时候,会得到 res=前一个curmax+后一个dup的结果,这个结果显然是不对的。 
2.哈希表的初始化是在第一层循环之后的,也就是说每个参考点有一个哈希表来存储。这样使得都是以参考点为基准比较,直接用斜率会出现几组点斜率相同平行但不共线的情况。


转自http://m.blog.csdn.net/u010773275/article/details/70145209



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值