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

参考https://blog.csdn.net/baidu_37964071/article/details/81021935

  1. 我们都知道,两点可以确定一条直线,而且可以写成y = ax + b的形式,在一条直线上的点都满足这个公式。所以这些给定点两两之间都可以算一个斜率,每个斜率代表一条直线,对每一条直线,带入所有的点看是否共线,并计算个数,这是整体的思路。
  2. 当两个点重合时,无法确定一条直线,但这也是共线的情况,需要特殊处理。
  3. 当斜率不存在时,由于两个点(x1, y1)和(x2, y2)的斜率k表示为(y2 - y1) / (x2 - x1),那么当x1 = x2时斜率不存在,这种共线情况需要特殊处理。
  4. 我们需要用到哈希表来记录斜率和共线点个数之间的映射,其中第一种重合点的情况我们假定其斜率为INT_MIN,第二种情况我们假定其斜率为INT_MAX,这样都可以用map映射了。
  5. 我们还需要定一个变量duplicate来记录重合点的个数,最后只需和哈希表中的数字相加即为共线点的总数。
测试用例:
[(0,0),(1,1),(0,0)]
对应输出应该为:
3

测试用例:
[(84,250),(0,0),(1,0),(0,-70),(0,-70),(1,-1),(21,10),(42,90),(-42,-230)]
对应输出应该为:
6

#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;

/**
给定二维平面上的n个点,找到位于同一直线上的最大点数
*/
struct Point {
    int x;
    int 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 maxPoints(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++;    //重合的点数
                    }
                    else {      //斜率不存在
                        kmap[INT_MAX]++;
                    }
                }
                else {
                    float k = (points[i].y - points[j].y)*1.0 / (points[i].x - points[j].x);
                    kmap[k]++;
                }

            }
            res = max(res, d);
            for (auto it = kmap.begin(); it != kmap.end(); it++) {
                res = max(res, it->second + d);
            }


        }//

        return res;


    }


};


int main()
{
    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 so;

    int maxNum=so.maxPoints(points);
    cout <<maxNum << endl;

    return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值