1. 程式人生 > 其它 >Go--Println、Printf區別

Go--Println、Printf區別

149. 直線上最多的點數

給你一個數組 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一個點。求最多有多少個點在同一條直線上。

示例 1:

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

示例 2:

輸入: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;
    }
};