力扣149. 直线上最多的点数

tech2022-12-16  113

力扣

本题的方法就是查找,但是测试用例中会有很多坑[[0,0],[94911150,94911151],[94911151,94911152]];这两个不是一个点,但由于浮点数的精度问题,导致一直计算为1个斜率。
处理方法:dy X 1000 / dx X 1000或者利用最简分数:9/18=3/6=1/2
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | o +-------------> 0 1 2 3 4 示例 2: 输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]] 输出: 4 解释: ^ | | o | o o | o | o o +-------------------> 0 1 2 3 4 5 6 链接:https://leetcode-cn.com/problems/max-points-on-a-line

题解:

class Solution: def maxPoints(self, points: List[List[int]]) -> int: #两点共线 if len(points) < 3: return len(points) from collections import defaultdict res = 0 for i in range(len(points)): record = defaultdict(int) samepoint = 0 #依次遍历所有的两两点,注意这里面有重复的点,所以需要samepoint++ for j in range(i + 1, len(points)): # if i != j: if points[i] == points[j]: samepoint += 1 else: record[get_slope(points, i, j)] += 1 for v in record.values(): # 这里加上重复的点,找最多共线的 res = max(v + samepoint, res) # print(v) # 这里是为了避免点都一样,返回samepoint res = max(res, samepoint) return res + 1 # 方法一:利用斜率,精度不够乘以1000来凑,必须分别乘,直接乘1000000还是会出现问题 # def get_slope(self, points, i, j): # if points[j][1] - points[i][1] == 0: # return 'inf' # else: # return (points[j][0]-points[i][0])*1000 / (points[j][1]-points[i][1])*1000 # 方法二:求最大公约数,这里不能用内嵌的函数,不懂为什么 # 求最大公约数 def gcd(x, y): if y == 0: return x else: return gcd(y, x % y) def get_slope(points, i, j): if points[j][1] - points[i][1] == 0: return 'inf' else: g = gcd(points[j][0] - points[i][0], points[j][1] - points[i][1]) # if g != 0: numerator = (points[j][0] - points[i][0]) // g denominator = (points[j][1] - points[i][1]) // g return '{}/{}'.format(numerator, denominator)

方法二:41 / 41 个通过测试用例

状态:通过 执行用时: 112 ms 内存消耗: 13.8 MB

方法一:41 / 41 个通过测试用例

状态:通过 执行用时: 76 ms 内存消耗: 13.6 MB

最新回复(0)