【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.

 翻译:给定2D平面上的Ñ个点,找出位于同一直线上的最大点数。

算法思路

//注意:需要两重循环,第一重循环遍历起始点 a,第二重循环遍历剩余点 b

//当a与b不重合时,即可构成一条直线

//除点位于垂线上时需单独考虑外(因斜率为无穷大),其它点均可根据公式得出斜率

//对于每个点a,构建 斜率->点数 的map

//b与a重合,以a起始的所有直线点数+1 (用dup统一相加)

//b与a不重合,a与b确定的直线点数+1

知识点补充

map用法

map是一种二叉树的数据存储结构。map内部自建一颗红黑树

map的特点:  (1)存储Key-value对(2)支持快速查找,查找的复杂度基本是Log(N)(3)快速插入,快速删除,快速修改记

map<string,int>mp;//这里的mp就是自己取的名字。定义map类型的变量mp

定义了一个map<int,int>FEL,怎么给FEl赋值(值为{2,1}{3,4}{4,5})

FEL[2] = 1;

FEL[3] = 4;

FEL[4] = 5;

代码详解

class Solution {

public:

    intmaxPoints(vector<Point> &points) {

        intnum = points.size();

       if(num < 2)  //考虑特殊情况,点数为0和1时,返回0或1

           return num;

        intret = 0;    //必须定义一个相对两重循环的全局变量

       for(int i=0; i<num; i++)

        {

           int dup = 0,vcnt = 1; //重复与垂直(必须放for循环里面,因每次i+1,都要重置参数开始计数)

           int curmax = 1; //必须初始化,否则输入(0,0)(0,0)时,直接dup++,curmax未初始化取随机值了

           map<double,int> mp;

           for(int j=0; j<num; j++)

            {

               if(i!=j)//不是同一个点

               {

                   double x1 = points[i].x - points[j].x; //注意:x1,y1必须为double型,否则计算斜率时,强制转换后会不准确

                   double y1 = points[i].y - points[j].y;

                   if(x1==0 && y1==0)

                        dup++;

                   else if(x1 == 0)

                         curmax = ++vcnt;

                   else

                   {

                        double k = y1/x1;

                        if(mp[k] == 0)//如果斜率对应的点数为0,则另其为2(说明之前没有这样斜率的点)

                            mp[k] = 2;

                        else

                            mp[k]++;

                       curmax =max(mp[k],curmax);

                   }

               }

            }

           ret = max(ret, curmax+dup);//没轮完一轮(选取一个起始点,再与其他所有点连线判点数),判断一回

        }

       return ret;

    }

};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值