1. 程式人生 > 其它 >6.24_直線上最多的點數_給陣列賦值

6.24_直線上最多的點數_給陣列賦值

6.24_直線上最多的點數:

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

輸入:points = [[1,1],[2,2],[3,3]]
輸出:3
輸入: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 中的所有點 互不相同

連結:https://leetcode-cn.com/problems/max-points-on-a-line

1、c

#include <stdlib.h> // NULL, abs
#include <math.h> // fmax
#include ".\lib\uthash-master\src\uthash.h" /* UT_hash_handle */
#include "stdio.h"

struct HashTable {
    int key, val;
    UT_hash_handle hh;
};

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

int maxPoints(int** points, int
pointsSize, int* pointsColSize) { int n = pointsSize; if (n <= 2) { return n; } int ret = 0; for (int i = 0; i < n; i++) { if (ret >= n - i || ret > n / 2) { break; } struct HashTable* hashTable = NULL; for (int j = i + 1
; j < n; j++) { int x = points[i][0] - points[j][0]; int y = points[i][1] - points[j][1]; if (x == 0) { y = 1; } else if (y == 0) { x = 1; } else { if (y < 0) { x = -x; y = -y; } int gcdXY = gcd(abs(x), abs(y)); x /= gcdXY, y /= gcdXY; } struct HashTable* tmp; int val = y + x * 20010; HASH_FIND_INT(hashTable, &val, tmp); if (tmp == NULL) { tmp = malloc(sizeof(struct HashTable)); tmp->key = val; tmp->val = 1; HASH_ADD_INT(hashTable, key, tmp); } else { tmp->val++; } } int maxn = 0; struct HashTable *iter, *tmp; HASH_ITER(hh, hashTable, iter, tmp) { maxn = fmax(maxn, iter->val + 1); HASH_DEL(hashTable, iter); free(iter); } ret = fmax(ret, maxn); } return ret; } int main() { // int points[3][2] = {{1,1}, {2,2}, {3,3}}; int points[3][2] = {1,1, 2, 2, 3,3}; // c語言這個大小怎麼輸入?? int pointsSize = sizeof(points) / sizeof(points[0]); int pointsColSize = sizeof(points[0]) / sizeof(points[0][0]); printf("%d", maxPoints((int **) points, pointsSize, (int *) pointsColSize)); }

2、java

import java.util.HashMap;
import java.util.Map;

class Solution {
   public int maxPoints(int[][] points) {
       int n = points.length;
       if (n <= 2) {
           return n;
       }
       int ret = 0;
       for (int i = 0; i < n; i++) {
           if (ret >= n - i || ret > n / 2) {
               break;
           }
           Map<Integer, Integer> map = new HashMap<Integer, Integer>();
           for (int j = i + 1; j < n; j++) {
               int x = points[i][0] - points[j][0];
               int y = points[i][1] - points[j][1];
               if (x == 0) {
                   y = 1;
               } else if (y == 0) {
                   x = 1;
               } else {
                   if (y < 0) {
                       x = -x;
                       y = -y;
                   }
                   int gcdXY = gcd(Math.abs(x), Math.abs(y));
                   x /= gcdXY;
                   y /= gcdXY;
               }
               int key = y + x * 20001;
               map.put(key, map.getOrDefault(key, 0) + 1);
           }
           int maxn = 0;
           for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
               int num = entry.getValue();
               maxn = Math.max(maxn, num + 1);
           }
           ret = Math.max(ret, maxn);
       }
       return ret;
   }

   public int gcd(int a, int b) {
       return b != 0 ? gcd(b, a % b) : a;
   }
}

public class Main {
   public static void main(String[] args) {
       int[][] points = {{1,1}, {2,2}, {3,3}};
       // Solution res = new Solution();
       // System.out.println(res.maxPoints(points));
       System.out.println(new Solution().maxPoints(points));
   }
}

3、c++

#include "iostream"
#include "vector"
#include "unordered_map"
using namespace std;

class Solution {
public:
    int gcd(int a, int b) {
        return b ? gcd(b, a % b) : a;
    }

    int maxPoints(vector<vector<int>>& points) {
        int n = points.size();
        if (n <= 2) {
            return n;
        }
        int ret = 0;
        for (int i = 0; i < n; i++) {
            if (ret >= n - i || ret > n / 2) {
                break;
            }
            unordered_map<int, int> mp;
            for (int j = i + 1; j < n; j++) {
                int x = points[i][0] - points[j][0];
                int y = points[i][1] - points[j][1];
                if (x == 0) {
                    y = 1;
                } else if (y == 0) {
                    x = 1;
                } else {
                    if (y < 0) {
                        x = -x;
                        y = -y;
                    }
                    int gcdXY = gcd(abs(x), abs(y));
                    x /= gcdXY, y /= gcdXY;
                }
                mp[y + x * 20001]++;
            }
            int maxn = 0;
            for (auto& [_, num] : mp) {
                maxn = max(maxn, num + 1);
            }
            ret = max(ret, maxn);
        }
        return ret;
    }
};

int main() {
    // 報錯的??
    // vector<vector<int>> points = {{1,1}, {2,2}, {3,3}};
    vector<vector<int>> points = {{1,1}, {2,2}, {3,3}};
    // vector<vector<int>> points = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
    cout << Solution().maxPoints(points) << endl;
}