题目:
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
示例:
思路:
- 计算通过定点x的所有直线斜率,用哈希表来记录同一斜率的个数,计算完成后更新最大点数;之后接着计算下一个点。
- 每次计算通过某一个点的斜率时,只需要与后面的点匹配计算,因为之前的点已经与该点匹配过了。
- 哈希表的key需要注意,由于斜率可能是浮点,用浮点做键值不稳定,所以我们需要用分数来表示斜率,把分子分母约分到最简形式,然后用字符存储,同时要注意正负号。
- 对于定点x重复出现的情况,我们额外记录出现的次数,最后加到计数里。
代码:
class Solution(object):
def maxPoints(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
if not points:
return 0
# 求最大公约数
def gcd(x, y):
if y == 0:
return x
else:
return gcd(y, x % y)
hashK = {}
maxCount = 1
for i in range(len(points)):
extraAdd = 0
tempMax = 1
for j in range(i+1, len(points)):
if points[i][0] == points[j][0] and points[i][1] == points[j][1]:
extraAdd += 1
continue
if points[i][0] == points[j][0]:
k = "nothing" + str(points[i][0])
elif points[i][1] == points[j][1]:
k = "0" + str(points[i][1])
else:
up = points[j][1] - points[i][1]
down = points[j][0] - points[i][0]
temp = gcd(up, down)
up /= temp
down /= temp
if up*down < 0:
mark = "-"
else:
mark = "+"
k = mark+str(abs(up))+"/"+str(abs(down))
if str(k) in hashK:
hashK[str(k)] += 1
else:
hashK[str(k)] = 1
for v in hashK.values():
tempMax = max(tempMax, v+1)
tempMax += extraAdd
maxCount = max(maxCount, tempMax)
hashK.clear()
return maxCount
本文介绍了一种计算二维平面上多个点中处于同一直线上的最大点数的方法。利用哈希表记录每条直线的斜率,并考虑点的重复情况,最终找出共线点的最大数量。

345

被折叠的 条评论
为什么被折叠?



