leetcode 给定二维平面上的n个点,找到位于同一直线上的最大点数

    我们都知道,两点可以确定一条直线,而且可以写成y = ax + b的形式,在一条直线上的点都满足这个公式。所以这些给定点两两之间都可以算一个斜率,每个斜率代表一条直线,对每一条直线,带入所有的点看是否共线,并计算个数,这是整体的思路。

1-当两个点重合时,无法确定一条直线,但这也是共线的情况,需要特殊处理。

2-当斜率不存在时,由于两个点(x1, y1)和(x2, y2)的斜率k表示为(y2 - y1) / (x2 - x1),那么当x1 = x2时斜率不存在,这种共线情况需要特殊处理。

3-我们需要用到哈希表来记录斜率和共线点个数之间的映射,其中第一种重合点的情况我们假定其斜率为INT_MIN,第二种情况我们假定其斜率为INT_MAX,这样都可以用map映射了。

4-我们还需要定一个变量duplicate来记录重合点的个数,最后只需和哈希表中的数字相加即为共线点的总数。

#include <iostream>
#include <string>
#include <map>
#include <vector>
/**
 *@date: 2020-3-27
 *@brief: 给定二维平面上的n个点,找到位于同一条直线上的最大点数
 *@attention:使用map数据结构
 */
using namespace std;
struct Point{
    int x,y;
    Point(){x=0;y=0;}//初始化
    Point(int a,int b):x(a),y(b){}
};
class  Solution
{
public:
     int max(int a,int b){
         return a>b?a:b;
     }
     int maxPoint(vector<Point> &points){
        int size=points.size();
        if(size<=2){
            return size; //如果只是一个点或者两个点直接返回
        }
        int res=0;
        for(int i=0;i<size;i++)//遍历所以的点
        {
            map<float,int> kmap;//存放斜率为k的点数
            int d=1;  //主要是用来记录重合点的个数
            for(int j=i+1;j<size;j++){
                if(points[i].x==points[j].x){
                    if(points[i].y==points[j].y){
                        d++;     //1.两点重合
                    }else{
                      kmap[INT_MAX]++; //2.斜率不存在的
                    }

                }else{
                //3.用来记录斜率存在的情况
                  float K=(points[j].y-points[i].y)/(points[j].x-points[i].x);
                  kmap[K]++;
                }
            }
            //进行比较三种情况的最大数
            res=max(res,d);
            for(auto it=kmap.begin();it!=kmap.end();it++){
                res=max(res,it->second+d);//it->first为key it->second 为value

            }
        }
        return res;
     }
};

int main(int argc, char *argv[])
{
    vector<Point> points;
    int n;
    cin>>n;
    int x,y;
    for(int i=0;i<n;i++){
        cin>>x>>y;
        Point point(x,y);
        points.push_back(point);
    }
    Solution solu;
    int maxnum=solu.maxPoint(points);
    cout<<maxnum<<endl;
    return 0;
}

*测试用例:
[(0,0),(1,1),(0,0)]
对应输出应该为:
3```*

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值