149. 直线上最多的点数

149. 直线上最多的点数

给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

示例 1:

img

输入:points = [[1,1],[2,2],[3,3]]
输出:3

示例 2:

img

输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4

提示:

  • 1 <= points.length <= 300
  • points[i].length == 2
  • -104 <= xi, yi <= 104
  • points 中的所有点 互不相同

思路:

​ 利用哈希表去存储直线即可,注意对于斜率要正确的去表示.

​ 不过像这样除法计算应该是不准确的,但是却可以通过。

​ 最好记录把y/x化简成最简形式,存储下来,如果计算除法会出现偏差问题

class Solution {
public:
    int maxPoints(vector<vector<int>>& points) {
        int len = points.size();
        // 点的数量不够
        if(len < 3) {
            return len;
        }
        int maxNum = 2;
        // 遍历每两个点
        for(int i = 0; i < len; i ++) {
            unordered_map<double, int> count;//y=kx+b 哈希表存储斜率
            for(int j = 0; j < len; j ++) {//求每两个点之间的直线
                if(i != j) {
                    long long dx = points[i][0] - points[j][0];
                    long long dy = points[i][1] - points[j][1];
                    double gradient = dy * 1.0 / dx;
                    if(count.count(gradient)) {//如果哈希表中存在那么就技术
                        count[gradient] ++;
                    } else {
                        count[gradient] = 2;
                    }
                    maxNum = max(maxNum, count[gradient]);//更新最大值
                } 
            }  
        }
        return maxNum;
    }
};
posted @ 2022-06-06 09:04  BailanZ  阅读(36)  评论(0编辑  收藏  举报