欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-02 18:21:44
...

参考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;

}