6.24_直線上最多的點數_給陣列賦值
阿新 • • 發佈:2021-06-26
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, intpointsSize, 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; }